首页 > 解决方案 > 如何根据 django 中的查询创建用于提供多个对象条目的表单?

问题描述

我目前正在处理我的大学管理应用程序,staff可以在其中输入学生的内部分数,学生可以查看他们的分数。我坚持的是,我想要一个表格列表来填写每个学生的内部分数并立即提交。

我用下面的代码尝试了modelformset,它的工作原理如下

formset = modelformset_factory(Internal, fields=('student','marks1','marks2','marks3'))
        if request.method == "POST":
            form=formset(request.POST)
            form.save()
        form = formset()
        return render(request, 'console/academics/internals.html',{'form':form})

对于模型

class Internal(models.Model):
    student = models.ForeignKey(User, on_delete=models.CASCADE)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
    marks1 = models.IntegerField(default=0)
    marks2 = models.IntegerField(default=0)
    marks3 = models.IntegerField(default=0)
    marks = models.IntegerField(default=100)
    marksob = models.IntegerField(default=0)

    def save(self):
        self.marksob = (self.marks1 + self.marks2 + self.marks3)/15
        return super(Internal, self).save()

<input>我希望使用 html而不是传入html 来呈现表单{{form}}。此外,我希望表单根据查询仅显示特定学生的条目。谁可以帮我这个事?

标签: htmldjango

解决方案


我希望表单根据查询仅显示特定学生的条目。

文档中所述,您可以为您的表单集指定一个queryset

formset = modelformset_factory(Internal, queryset=Internal.Objects.filter(...), fields=('student','marks1','marks2','marks3'))

我希望在 html 中使用而不是在 html 中传递 {{form}} 来呈现表单

您可以通过迭代字段来做到这一点,就像普通形式一样:

<form method="post"> {% csrf_token %}
    {{ formset.management_form }}
    {% for form in formset %}
        {% for field in form %}
            {{ field.label_tag }} {{ field }}
        {% endfor %}
    {% endfor %}
</form>

在模板中使用表单集的更多详细信息。

编辑

如果您想为表单字段使用自定义 css 类,您可以执行以下操作:

<form method="post"> {% csrf_token %}
    {{ formset.management_form }}
    {% for form in formset %}

        <div class="...">
            {{ form.marks1.errors }}
            <label for="{{ form.marks1.id_for_label }}">Your email address:</label>
            <input type="number" name="{{ form.marks1.name }}" value="{{ form.marks1.value }}" class="css-class">
        </div>

        <!-- and for other fields as well -->

    {% endfor %}
</form>

推荐阅读