在一个页面上使用多个不同的表单(Django 1.7中的Crispyforms)

时间:2014-12-13 22:27:15

标签: django forms django-crispy-forms django-1.7

我正在尝试在我的大学管理网站的一个页面上显示多个表单。这个想法是教师应该可以在同一页面上的小组评估中输入小组的所有分数。视图应显示组元素表单,然后显示单个元素的多个表单(组的大小可能会有所不同)。

Django文档对于表单前缀的概念有点简短,所以我不太确定这是否是正确的方法。我想用酥脆的形式渲染表格。这种方法是否有效或是否有更好的方法来实现我的目标?

views.py
--------
# Generate the forms for the template
group_form = GroupForm(prefix='group')
student_forms = []
for student in students_in_group:
    student_form = StudentForm(initial={...}, prefix=student.student_id)
    student_forms.append(student_form)
...
# Processing post request
if request.method == 'POST':
    group_form = GroupForm(request.POST, prefix='group')
    if group_form.is_valid():
        group_form.save()
    for student in students_in_group:
        student_form = StudentForm(request.POST, prefix=student.student_id)
        if student_form.is_valid():
            student_form.save()


group_feedback.html
-------------------
{% crispy group_form %}
{% for form in student_forms %}
{% crispy form %}
{% endfor %}

1 个答案:

答案 0 :(得分:1)

该代码似乎应该按照您期望的方式运行。尽管如此,将表单集用于StudentForm表单列表可能是一种更简洁的方法。

views.py

StudentFormSet = modelformset_factory(Student)

# Processing post request
if request.method == 'POST':
    group_form = GroupForm(request.POST, prefix='group')
    if group_form.is_valid():
        group_form.save()
    formset = StudentFormSet(request.POST, prefix='student')
    if formset.is_valid():
        formset.save()
else:
    # Generate the forms for the template
    group_form = GroupForm(prefix='group')
    formset = StudentFormSet(queryset=Student.objects.filter(whatever gives you students_in_group), prefix='student')

我还没有审查过formtable如何使用crispyforms来实现它的价值。