我有一个用来提交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发布于 2015-04-24 08:35:14
在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 '')你不需要像现在这样用一个键来解开字典。
https://stackoverflow.com/questions/29835350
复制相似问题