Formset не применяется требуется = True - PullRequest
0 голосов
/ 18 марта 2020

Я использую набор форм, составленный из нескольких форм, где каждая форма содержит ModelChoiceField. Однако, хотя я написал required=True для этого поля, я могу публиковать данные, хотя я ничего не выделяю в нем (глядя на исходный код HTML, я действительно могу убедиться, что required не включен в select тег).

Более того, formset.is_valid() возвращает True вопреки тому, что я ожидал.

До сих пор мне удалось решить эту проблему, добавив 'required' : 'required' в attrs (см. Ниже), но я думаю, что это не обычный способ достичь этого.

Вот мои forms.py:

class InitialForm(forms.Form):
    group = forms.ModelChoiceField(queryset=Group.objects.all(), required=True, label="Poule",
                                   widget=forms.Select(attrs={'class': 'select'}))
    nb_rounds = forms.IntegerField(min_value=1, max_value=5, required=True, label="Nombre de manches", initial=1,
                                   widget=forms.NumberInput(attrs={'class':'input', 'style': 'width:5ch'}))
    nb_teams = forms.IntegerField(min_value=2, max_value=5, required=True, label="Nombre d'équipes", initial=2,
                                  widget=forms.NumberInput(attrs={'class': 'input', 'style': 'width:5ch'}))

class FinalForm(forms.Form):
    def __init__(self, *args, **kwargs):
        group = kwargs.pop('group')
        nb_rounds = kwargs.pop('nb_rounds')
        super(FinalForm, self).__init__(*args, **kwargs)
        self.fields['teams'] = forms.ModelChoiceField(queryset=Team.objects.filter(group=group), required=True,
                                                      label="Equipe",
                                                      widget=forms.Select(attrs={'class': 'select',
                                                                                 'required': 'required'}))
        for i in range(nb_rounds):
            self.fields['score_%i' % i] = forms.IntegerField(min_value=0, max_value=50, required=True, label="Score", initial=0,
                                   widget=forms.NumberInput(attrs={'class':'input', 'style': 'width:5ch'}))

и views.py

def initial_new_game(request):
    # GET request
    if request.method == 'GET':
        form = InitialForm()
        return render(request, 'initial_form.html', {'form': form})
    # POST request
    else:
        form = InitialForm(request.POST)
        if form.is_valid():
            request.session['group_id'] = form.cleaned_data['group'].id
            request.session['nb_teams'] = form.cleaned_data['nb_teams']
            request.session['nb_rounds'] = form.cleaned_data['nb_rounds']
            request.session['form-submitted'] = True
            return redirect('final_new_game')
        else:
            return render(request, 'initial_form.html', {'form': form})


def final_new_game(request):
    if request.session.get('form-submitted'):
        group_id = request.session.get('group_id')
        nb_teams = request.session.get('nb_teams')
        nb_rounds = request.session.get('nb_rounds')
        FinalFormSet = formset_factory(FinalForm, extra=nb_teams)

        if request.method == 'GET':
            formset = FinalFormSet(form_kwargs={'group': group_id, 'nb_rounds': nb_rounds})
            return render(request, 'final_form.html', {'formset': formset})

        if request.method == 'POST':
            print(request.POST)
            formset = FinalFormSet(request.POST, form_kwargs={'group': group_id, 'nb_rounds': nb_rounds})
            all_forms_valid = all([form.is_valid() for form in formset])
            print(formset.is_valid())

            if all_forms_valid:
                print("form OK")
                form = InitialForm()
                return render(request, 'initial_form.html', {'form': form})

            else:
                return render(request, 'final_form.html', {'formset': formset})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...