我有一个模型,其中包含一个名称和电子邮件字段。我想显示一个模板,它有一个表单集(modelformset),用于更新该模型上给定的查询集的电子邮件字段。
models.py
class Student(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = models.OneToOneField(
settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
student_first = models.CharField(max_length=30)
student_last = models.CharField(max_length=30)
student_number = models.IntegerField()
email = models.EmailField(max_length=50)
class Meta:
ordering = ['student_first']views.py
def editstudentemail(request, classroom_pk):
classblock = get_object_or_404(Classroom, pk=classroom_pk)
students = Student.objects.filter(classroom=classblock).order_by('student_first')
EditEmailFormSet = modelformset_factory(Student, fields=('email',), extra=0)
if request.method == 'POST':
formset = EditEmailFormSet(request.POST, queryset=students)
if formset.is_valid():
print("valid")
instances = formset.save()
else:
print("not valid")
return redirect('gradebook:classroomdetail', classroom_id=classroom_pk)
formset = EditEmailFormSet(queryset=students)
context = {'classblock': classblock}
context['students'] = students
context['formset'] = formset
return render(request, 'gradebook/editstudentemail.html', context)模板:
{% if students %}
<form method="post">{% csrf_token %}
{% for ss in students %}
<div class="row">
<div class="col-4">
<b>{{ ss.student_first }}</b>
</div>
<div class="col-4">
{% for form in formset %}
{% if forloop.parentloop.counter == forloop.counter %}
{{ form|crispy }}<br/>
{% endif %}
{% endfor %}
</div>
<hr/>
</div>
{% endfor %}
<input type="submit" value="Save" class="btn btn-outline-primary mt-2" />
</form>
{% endif %}模板中嵌套的for循环使我可以在表单输入框旁边打印学生姓名,以编辑电子邮件。(也许有更好的方法来做到这一点,也许可以将字段student_first包含在表单集中,但使其不可编辑。)
我想我可能没有正确地保存表单/表单集,但是我的第一个问题是当我查看这个模板时,not valid会被打印到控制台上。没有任何错误,formset.is_valid()正在返回False。
发布于 2021-12-06 21:55:47
对于这种情况,我需要显式地将managementform添加到模板中:
<form method="post">{% csrf_token %}
{{ formset.management_form }}
{% for ss in students %}
...我已经看过文档中提到的管理形式了,但我不清楚它是否会/何时添加到模板中。
发布于 2021-12-05 23:42:16
请试以下几点
instances = formset.save(commit=False)
for instance in instances:
instance.save()本质上是单独保存实例
https://stackoverflow.com/questions/70156264
复制相似问题