Встроенная проверка формы возвращает пустой список formset.errors

У меня есть следующий встроенный набор форм:

CreateClientFormset = inlineformset_factory(
    Client,
    EventType,
    fields=(
        'name',
    ),
    extra=0,
    can_delete=True,
    min_num=1,
    validate_min=True,
    widgets={
        'name': forms.TextInput(attrs={
            'class':'form-control',
            'maxlength' : 50
        })
    })

И следующий вид:

def create_client(request):
    form = CreateClient()
    formset = CreateClientFormset(instance=Client())

    if request.method == 'POST':
        form = CreateClient(request.POST)

        if form.is_valid():
            client_saved = form.save(commit=False)
            client_formset = CreateClientFormset(request.POST, request.FILES, instance=client_saved)

            if client_formset.is_valid():
                client_saved.save()
                client_formset.save()

                return redirect(clients)
            else:
                print client_formset.errors
    else:
        print form.errors

    return render(request, 'create_client.html', {'form' : form, 'formset' : formset})

Когда я пытаюсь отправить пустое значение в набор форм, он выводит ошибку на консоль, но ничего не делает в шаблоне.

Это мой шаблон:

{% for field in formset %}
{{ formset.management_form }}
    <tr>
        <td><label>{{ field.name.label }}</label></td>
            <td>
              {% if field.instance.pk %}{{ field.DELETE }}{% endif %}
              {{ field.name }}
              {{ formset.errors }}
              {{ field.id }}
              {% for hidden in formset.hidden_fields %}
                {{ hidden }}
              {% endfor %}
            </td>
    </tr>
{% endfor %}

{{ formset.errors }} отображает [] еще до отправки формы.

Что я делаю не так? Спасибо.


person Roger Gonzalez    schedule 29.04.2016    source источник
comment
Где находится часть представления, где вы отображаете шаблон?   -  person Daniel Roseman    schedule 29.04.2016
comment
См. редактирование @DanielRoseman внизу части представления.   -  person Roger Gonzalez    schedule 29.04.2016


Ответы (2)


Я решил это так:

if client_formset.is_valid():
    client_saved.save()
    client_formset.save()

    return redirect(clients)
else:
    print client_formset.errors
    return render(request, 'create_client.html', {'form' : form, 'formset' : formset, 'formset_errors' : client_formset.errors})

И в шаблоне:

{% for field in formset %}
    <tr>
        <td><label>{{ field.name.label }}</label></td>
        <td>
            {% if field.instance.pk %}{{ field.DELETE }}{% endif %}
            {{ field.name }}
            {% if formset_errors %}
                {% for errors in formset_errors %}
                    {% for error in errors.values %}
                        {{ error }}
                    {% endfor %}
                {% endfor %}
            {% endif %}
            {{ field.id }}
            {% for hidden in formset.hidden_fields %}
                {{ hidden }}
            {% endfor %}
        </td>
    </tr>
{% endfor %}
person Roger Gonzalez    schedule 29.04.2016

Вы визуализируете formset:

return render(request, 'create_client.html', {'form' : form, 'formset' : formset})

но тот, который загружен с вашими данными/ошибками формы, это client_formset:

print client_formset.errors

Второй вам нужно передать для рендеринга, так как вы используете {{ formset.errors }} в своем шаблоне.

person fips    schedule 29.04.2016