区分空字符串表示无值并指示空值

时间:2015-04-23 22:18:26

标签: python django django-forms

我有一个Django表单,我用它来提交GET请求。视图采用表单输入并将其用作参数,以过滤查询集以生成搜索结果列表。我需要在其中一个字段的选项顶部添加空白和无选项。我希望空白值表示"不要过滤此字段"。我希望None值表示"过滤此字段以显示空白状态"。我遇到的问题是,在我的表单方法中进行过滤,我需要检查值是否真实(以便空白提交没有过滤)我需要转换字符串&#39 ;无'明确地对待'。

如何编写此代码以区分选择不应过滤的值和明确查询''?

class MyFilterForm(forms.Form):
    is_open = forms.BooleanField(required=False)
    STATUS_CHOICES = (
        ('A', 'A'),
        ('B', 'B'),
        ('C', 'C'),
    )
    status = forms.ChoiceField(
        choices=(('', 'All'),
                 ('None', 'None')) + STATUS_CHOICES,
        required=False)

    def filter_qs(self, qs):
        for key, value in self.cleaned_data.items():
            # Check for truthiness so that '' means do not filter
            if value:

                # Special treatment of 'None'
                # Convert 'None' to ''
                if value == 'None':
                    value = ''

                qs = qs.filter(**{key: value})
        return qs

1 个答案:

答案 0 :(得分:0)

Python中没有False,空字符串也是如此。要区分这两者,请使用is运算符,如下所示:

if value is None:
    #im none, do something

你的逻辑非常令人困惑 - 你希望空字符串表示不要过滤,但是你将其更改为空白的无值,并希望它表示“空白状态”,无论这意味着什么...

if值运算符仅对非空字符串而不是None值进行操作,因此永远不会到达那里的None逻辑。所以你可以(如果我理解逻辑);

if value:
    #do filtering
elif value is None:
    #do something with your None object

更新:

像你这样过滤你的qs:

new_qs = qs.filter(key=value if value != 'None' else '')

您不需要像正在使用单个键解压缩字典。