首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django - formset用于更新字段,formset无效。

Django - formset用于更新字段,formset无效。
EN

Stack Overflow用户
提问于 2021-11-29 14:24:18
回答 2查看 125关注 0票数 1

我有一个模型,其中包含一个名称和电子邮件字段。我想显示一个模板,它有一个表单集(modelformset),用于更新该模型上给定的查询集的电子邮件字段。

models.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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)

模板:

代码语言:javascript
复制
{% 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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-06 21:55:47

对于这种情况,我需要显式地将managementform添加到模板中:

代码语言:javascript
复制
<form method="post">{% csrf_token %}
    {{ formset.management_form }}
    {% for ss in students %}
    ...

我已经看过文档中提到的管理形式了,但我不清楚它是否会/何时添加到模板中。

票数 1
EN

Stack Overflow用户

发布于 2021-12-05 23:42:16

请试以下几点

代码语言:javascript
复制
instances = formset.save(commit=False)
for instance in instances:
     instance.save()

本质上是单独保存实例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70156264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档