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
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
{% for field in gradeformset.forms.0 %}
{% if not field.is_hidden %}
{{ field.label }}
{% endif %}
{% endfor %}
{% for f in gradeformset.management_form %}
{{ f }}
{% endfor %}
{% for student, gradeform in zips %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{{ student.name }}
{{ gradeform.gradeA }}
{{ gradeform.gradeB }}
{% endfor %}
You can read more about Django formset here http://whoisnicoleharris.com/2015/01/06/implementing-django-formsets.html