Why are read-only form fields in Django a bad idea?

前端 未结 4 1616
天命终不由人
天命终不由人 2020-12-25 11:40

I\'ve been looking for a way to create a read-only form field and every article I\'ve found on the subject comes with a statement that \"this is a bad idea\". Now for an in

相关标签:
4条回答
  • 2020-12-25 11:49

    for student/grading example, I have come up with a solution, where students are non editable fields and grades can be edited and updated as required. something like this

    I am combining students objects and formset for grades in grade_edit class in view.py using zip function.

    def grade_edit(request, id):
        student = student.objects.get(id=id)
        grades = grades.objects.filter(studentId=id)
        gradeformset = GradeFormSet(request.POST or None)
        if request.POST:
            gradeformset = GradeFormSet(request.POST, request.FILES, instance=student)
            if gradeformset.is_valid():
                gradeformset.save()
                grades = grades.objects.filter(studentId=id)
                return render(request, 'grade_details.html', {'student': student, 'grades': grades})
        else:
            gradeformset = GradeFormSet(instance=student)
            grades = grades.objects.filter(studentId=id)
            zips = zip(grades, gradeformset)
        return render(request, 'grade_edit.html', {'zips': zips, 'student': student, 'gradeformset': gradeformset })
    

    My template looks something like this

    <table>
             <tr>
         {% for field in gradeformset.forms.0 %}
              {% if not field.is_hidden %}
                   <th>{{ field.label }}</th>
              {% endif %}
         {% endfor %}
         </tr>
         {% for f in gradeformset.management_form %}
              {{ f }}
         {% endfor %}
         {% for student, gradeform in zips %}
              <tr>
                 {% for hidden in form.hidden_fields %}
                     {{ hidden }}
                 {% endfor %}
                 <td> {{ student.name }} </td>
                 <td> {{ gradeform.gradeA }} </td>
                 <td> {{ gradeform.gradeB }} </td>
              </tr>
         {% endfor %}
    </table>
    

    You can read more about Django formset here http://whoisnicoleharris.com/2015/01/06/implementing-django-formsets.html

    0 讨论(0)
  • 2020-12-25 11:55

    When using a disabled field, you also need to make sure it remains populated correctly if the form fails validation. Here's my method, which also takes care of malicious attempts to change the data submitted:

    class MyForm(forms.Form):
    
        MY_VALUE = 'SOMETHING'
        myfield = forms.CharField(
            initial=MY_VALUE,
            widget=forms.TextInput(attrs={'disabled': 'disabled'})
    
        def __init__(self, *args, **kwargs):
    
            # If the form has been submitted, populate the disabled field
            if 'data' in kwargs:
                data = kwargs['data'].copy()
                self.prefix = kwargs.get('prefix')
                data[self.add_prefix('myfield')] = MY_VALUE
                kwargs['data'] = data
    
            super(MyForm, self).__init__(*args, **kwargs) 
    
    0 讨论(0)
  • 2020-12-25 12:00

    The reason you don't want to do this is because someone can change your disabled field to enabled and then submit the form. You would have to change the save function as to not insert the "disabled" data.

    The standard way to do this is to not put the name in an input, but to display it as text

    <form>
        <div>
            <label>Name</label>
            <p>Johnny Five</p>
        </div>
        <div>
            ....
    

    This is not possible in django.

    I say if you really trust your userbase to not "mess" with things then go for it, but if its a public facing website with possible sensitive data then stay away.

    0 讨论(0)
  • 2020-12-25 12:00

    As far as I can see for your situation, this is the ideal answer:

    https://stackoverflow.com/a/2242468/1004781

    Ie, simply print the model variables in the template:

    {{ form.instance.LastName }}
    
    0 讨论(0)
提交回复
热议问题