Django post-form не может пройти валидацию при использовании формы с дополнительными входами
У меня есть форма, содержащая af MultipleChoiceField
, где варианты выбора создаются динамически на основе данного пользователя
class UpdateForm(forms.Form):
def __init__(self,names,*args,**kwargs):
super(UpdateForm,self).__init__(*args,**kwargs)
self.fields["list_names"] = forms.MultipleChoiceField(choices = zip(names,names),widget=forms.CheckboxSelectMultiple,label="Pick some names")
add_new = forms.BooleanField(initial=True, label="Add new names?",required=False)
delete_missing = forms.BooleanField(label = "Delete names?",required=False)
и он работает нормально как GET-запрос, проблемы возникают с пост-запросом:
Мое мнение следующее:
def update(request):
user = request.user
list_names = MyModel.objects.filter(user=user).all().values_list("nick_name",flat=True).distinct()
form = UpdateWishlistForm(names =list_names)
if request.method == "POST":
post_form = UpdateForm(request.POST)
if post_form.is_valid():
list_names = post_form.cleaned_data["list_names"]
add_new = post_form.cleaned_data["add_new"]
delete_missing = post_form.cleaned_data["delete_missing"]
messages.success(request, "Success")
context = {
"form":form,
}
redirect("home")
else:
#invalid post_form
messages.error(request, "Error")
context = {
"form":form,
}
return render(request, "discounttracker/update.html")
else: #Get request
context = {
"form":form,
}
return render(request, "myapp/update.html",context=context)
post_form = UpdateForm(request.POST)
не подтверждается, а post_form.errors
пуст.
Хотя в нем содержатся данные (до вызова post_form.is_valid()
)
print(post_form)
# UpdateForm: <UpdateForm bound=False, valid=Unknown, fields=(add_new;delete_missing;list_names)>
print(request.POST.dict())
#<QueryDict: {'csrfmiddlewaretoken': ['...'], 'add_new': ['on'], 'list_names': ['test_name_1']}>
но я замечаю, что он не связан, поэтому не валидируется. Но я не могу понять, почему он не "связывается" при разборе request.POST
?
В POST-запросе необходимо также передать имена, поэтому:
list_names = MyModel.objects.filter(user=user).values_list("nick_name",flat=True).distinct()
form = UpdateWishlistForm(names=list_names)
if request.method == 'POST':
post_form = UpdateForm(names=list_names, data=request.POST)
# …
# …
Но я бы посоветовал работать с ModelMultipleChoiceField
[Django-doc] и таким образом передавать queryset. Поскольку имена ников, очевидно, могут содержать дубликаты, возможно, лучше сделать модель Nickname
и использовать ForeignKey
к этой модели.