【问题标题】:Differentiating between empty string indicating no value and indicating a blank value区分空字符串表示无值和表示空值
【发布时间】:2015-07-02 08:11:33
【问题描述】:

我有一个用于提交 GET 请求的 Django 表单。该视图采用表单输入并将其用作参数来过滤查询集以生成搜索结果列表。我需要在其中一个字段的选项顶部添加空白和无选项。我希望空白值表示“不过滤此字段”。我希望 None 值表示“过滤此字段以使其处于空白状态”。我遇到的问题是,在我的表单进行过滤的方法中,我需要检查该值是否真实(以便空白提交不进行过滤),并且我需要将字符串 '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

【问题讨论】:

  • 你能指出你的代码在哪里没有达到你想要的条件吗?
  • 它不会失败。我正在寻找一种更简洁的方法来实现将表单输入传递给不涉及特殊 if 语句的查询集。

标签: python django django-forms


【解决方案1】:

在 Python 中 None 是 Falsey,空字符串也是如此。要区分两者,请使用 is 运算符,如下所示:

if value is None:
    #im none, do something

您的逻辑非常混乱 - 您希望空字符串表示不过滤,但您将 None 值更改为空白,并希望它表示“空白状态”,无论这意味着什么......

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 '')

你不需要像你那样用一个键解压字典。

【讨论】:

  • 2 分:1)“空白状态”表示该字段的值为空字符串,即 myobject.myfield == ''。 2) 达到了无逻辑,因为提交的“无”选项的值是“无”,它是一个字符串,而不是“无”值。参考状态字段的choices关键字参数:('None', 'None')。
  • 我的问题不是关于 Python 语法的细节。我要问的是什么是处理用户通过选择输入提交的输入的清晰方法,以便创建正确的查询集。具体来说,这意味着如果用户选择“全部”,则不应过滤查询集;如果用户选择“无”,则应针对空字符串过滤查询集。
猜你喜欢
  • 1970-01-01
  • 2023-02-04
  • 2023-01-30
  • 2023-04-10
  • 2023-03-12
  • 2014-10-01
  • 2011-04-24
  • 1970-01-01
  • 2013-09-07
相关资源
最近更新 更多