Использование нескольких разных форм на одной странице (Crispyforms в 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 %}

person Tobi    schedule 13.12.2014    source источник


Ответы (1)


Этот код выглядит так, как будто он должен работать так, как вы ожидаете. Хотя, может быть более чистым подходом будет использовать набор форм для списка StudentForm форм.

просмотры.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')

Я не проверял, как наборы форм будут играть с хрустящими формами, чего бы это ни стоило.

person Kevin Cherepski    schedule 13.12.2014