区分表示无值的空字符串和表示空值的空字符串

2024-04-20 10:00:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django表单,我用它来提交GET请求。该视图接受表单输入并将其用作参数来过滤查询集以生成搜索结果列表。我需要在其中一个字段的选项顶部添加空白和无选项。我希望空白值是指“不要过滤这个字段”。我希望None值的意思是“过滤此字段以获得空白状态”。我遇到的问题是,在执行筛选的窗体的方法中,我需要检查值是否为truthy(以便空白提交不会进行筛选),并且需要将字符串“None”显式转换为“”。你知道吗

如何编写此代码来区分选择不应筛选的值和显式查询“”?你知道吗

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

Tags: keyselfnonefalse表单forvalue选项
1条回答
网友
1楼 · 发布于 2024-04-20 10:00:12

在Python中,没有一个是错误的,就像空字符串一样。要区分两者,请使用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

更新:

按如下方式筛选你的Q:

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

你不需要像现在这样用一把钥匙打开字典。你知道吗

相关问题 更多 >