Django post-form 在将 Form 与其他输入一起使用时无法验证
Django post-form cannot validate when using Form with additional inputs
我有一个包含 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 请求工作正常,问题是 post-请求:
我的观点如下:
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(<strong>names=list_names, data=request.POST</strong>)
# …
# …
但我建议使用 ModelMultipleChoiceField
[Django-doc] 并因此传递一个查询集。由于昵称显然可以包含重复项,因此制作一个 Nickname
模型并对该模型使用 ForeignKey
s 可能会更好。
我有一个包含 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 请求工作正常,问题是 post-请求:
我的观点如下:
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(<strong>names=list_names, data=request.POST</strong>)
# …
# …
但我建议使用 ModelMultipleChoiceField
[Django-doc] 并因此传递一个查询集。由于昵称显然可以包含重复项,因此制作一个 Nickname
模型并对该模型使用 ForeignKey
s 可能会更好。