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 模型并对该模型使用 ForeignKeys 可能会更好。