我有一个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
答案 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 '')
您不需要像正在使用单个键解压缩字典。