Я использую набор форм, составленный из нескольких форм, где каждая форма содержит 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})