Как установить каждое поле, как требуется для formset_factory в Django (как проверить пустые формы в наборах форм) - PullRequest
1 голос
/ 23 февраля 2020

У меня есть форма в моем forms.py:

class NameForm(forms.Form):
    your_name = forms.CharField(label='Your name', max_length=100)
    age = forms.CharField(label='Age', max_length=100)
    sex = forms.CharField(label='Sex', max_length=100)

Я создал formset_factory

NameFormSet = formset_factory(NameForm, extra=0)

В моем views.py для получения context_data у меня есть:

...
def get_context_data(self, **kwargs):
        context = super(APView, self).get_context_data(**kwargs)
        if self.request.POST:
            context['formset'] = NameFormSet()
        else:
            recommended = returnWebAttackResults(self.kwargs['webAttack'])
            if recommended is None:
                context['recommendedAP'] = False
            else:
                context['formset'] = NameFormSet(initial=recommended[0])
                return context
....

В моем файле шаблона у меня есть:

<form class="row" method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        {{ formset.management_form }}
        {{ formset.non_form_errors }}
             {% for forma in formset.forms %}
                  {{ forma }}
             {% endfor %}
        <input class="btn bg-success" type="submit" value="Update" />
 </form>

Моя проблема в том, что я не получаю «Это поле обязательно для заполнения», когда я нажимаю кнопку «Обновить». Я попытался установить для use_required_attribute значение True, но это не сработало.

Сценарий:

Функция returnWebAttackResults получает исходные данные для форм в наборе форм. Итак, если у меня есть три формы, если одно из полей не заполнено (нет ввода данных пользователем) в какой-либо из форм, то, когда я нажимаю кнопку «Обновить», каждое пустое поле должно выделяться надписью «Это поле обязательно для заполнения» , Я могу сделать это, когда просто отображаю обычную форму, но когда я использую наборы форм, она не работает.

Есть ли способ проверки форм в наборе форм перед отправкой запроса?

1 Ответ

0 голосов
/ 12 марта 2020

Я столкнулся с той же проблемой и нашел ее в документации

https://docs.djangoproject.com/en/3.0/ref/forms/fields/#core -field-arguments

Виджеты обязательных полей формы имеют необходимые HTML атрибут. Установите для атрибута Form.use_required_attribute значение False, чтобы отключить его. Обязательный атрибут не включен в формы наборов форм, потому что проверка браузера может быть неправильной при добавлении и удалении наборов форм.

Если у вас есть пустая строка (для добавления дополнительной записи), тогда вы можете Не сохраняйте форму до тех пор, пока не будет заполнена пустая строка. Поэтому, если вы хотите сказать, обновить одну существующую строку, не добавляя дополнительную строку, то у вас есть проблема, вы не можете это сделать. Проблема действительно заключается в том факте, что набор форм действительно в терминах html только одна форма. Обходной путь для этой проблемы может заключаться в использовании javascript для добавления строк в набор форм только по мере необходимости, как в этом примере:

https://whoisnicoleharris.com/2015/01/06/implementing-django-formsets.html

Существует возможно, кроме того, javascript решение для проверки полей формы перед отправкой запроса, я думаю, что это может быть такое решение, но я не пробовал:

https://jqueryvalidation.org/required-method/

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

ОБНОВЛЕНИЕ: я получил простое решение, работающее на примере по ссылке выше. Мой шаблон выглядит следующим образом (обратите внимание, что вначале пустая строка не отображается благодаря оператору if):

{% extends "base_generic.html" %}

{% load static %}

{% block content %}
    <h1>Experiment Detail</h1>

    <form name="test_form" method="post">
        {% csrf_token %}
        {{ formset.management_form }}

        {% for form in formset %}
        {% if form.name.value %}
        <div class="link-formset">
            {{ form.name }}
        </div>
        {% endif %}
        {% endfor %}

        <input type="submit" value="Save" class="button"/>
    </form>

    <!-- Include formset plugin - including jQuery dependency -->
    <!-- <script src="{% static 'path_to/jquery-3.4.1.js' %}"></script> -->
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script src="{% static 'js/jquery_formset.js' %}"></script>
    <script>
        $('.link-formset').formset({
            addText: 'Add',
            deleteText: 'Delete'
        });
    </script>

{% endblock %}

На мой взгляд, у меня есть это для l oop для установки use_required_attribute:

for form in formSet:

    form.use_required_attribute = True

Решение работает нормально, когда я нажимаю кнопку «Добавить», появляется пустая строка, и пустое поле «имя» имеет ожидаемое красное поле вокруг пустого поля, и когда я пытаюсь нажать «Сохранить», я получаю сообщение » Пожалуйста, заполните это поле. '

...