Django表单:在if语句中使用清理后的数据

2 投票
2 回答
822 浏览
提问于 2025-04-18 13:23

我刚接触Python和Django,现在在处理一个表单时遇到了一些困难。这个表单有三个字段,我希望每个字段都可以留空。在视图中,我想根据哪些字段留空来写一个if-elif-else的判断语句,但在这里出现了问题。

如果我把第一个字段留空,变量a会变成一个空列表,如果我打印它,确实是空的。但是在if语句中,a == [ ]似乎没有起作用,它直接跳到了else部分,在那里因为随机函数无法在d(一个空列表,因为它被a过滤了)上使用而出错。

如果我不把表单中的任何字段留空,一切都正常。

我的问题是:在处理清理后的数据时,是否不能使用if语句,还是我做错了什么?为什么“if a == [ ]”不生效?

以下是代码的部分内容。视图:

def SomeFunction(request):
  if request.method == 'POST':
    form = SomeForm(request.POST)
    if form.is_valid():
        a = form.cleaned_data['field1']
        b = form.cleaned_data['field2']
        c = form.cleaned_data['field3']

        form = form.save()

        if a == []:
            d = Model2.objects.filter(Model2field2=b, Model2field3=c).distinct()
            e = random.choice(d)
            return render(request, 'SomePage.html', {
                'e' : e
            })

        #Here I have some similar elif statements..

        else:
            d = Model2.objects.filter(Model2field1=a, Model2field2=b, Model2field3=c).distinct()
            e = random.choice(d)
            return render(request, 'SomePage.html', {
                'e' : e
            })

表单:

class SomeForm(forms.ModelForm):
  class Meta:
    model = Model1
    fields = ['field1', 'field2', 'field3']
    widgets = {
        'field1' : forms.CheckboxSelectMultiple,
        'field2' : forms.CheckboxSelectMultiple,
        'field3' : forms.CheckboxSelectMultiple,
    }

2 个回答

1

你可以这样做:

if a is None:
    ....
1

你在检查变量a是否是一个空列表。但这样检查永远不会成立:对于一个ModelMultipleChoiceField(这是为ManyToManyField创建的字段),它的空值是一个空的查询集——你可以查看文档了解更多。

相反,你可以直接使用布尔值比较:

if not a:

撰写回答