Python 视图中有多个过滤器选项。正确设置这些过滤器。仅设置一个';禁用';过滤器
我有两张表格 第一个提交到数据库。工作完美。 第二种检索数据库信息,也可以正常工作 然而,我在表单中有一些过滤器工作得并不完美 我有几个过滤器Python 视图中有多个过滤器选项。正确设置这些过滤器。仅设置一个';禁用';过滤器,python,django,django-forms,Python,Django,Django Forms,我有两张表格 第一个提交到数据库。工作完美。 第二种检索数据库信息,也可以正常工作 然而,我在表单中有一些过滤器工作得并不完美 我有几个过滤器 位置 类型 日期范围 如果设置了所有过滤器,它们将正常工作 如果只设置了一个,则它们不起作用。我不明白为什么会这样 forms.py(筛选表单): views.py(筛选表单): 在html文件中: <div class="col-md-3">{{ form.location }} {{ form.dateStart
- 位置
- 类型
- 日期范围
<div class="col-md-3">{{ form.location }}
{{ form.dateStart }} <p>To</p>
{{ form.dateEnd }}
{{ form.overtime_type }}
</div>
{{form.location}
{{form.dateStart}}To
{{form.dateEnd}
{{form.u类型}
这就是表单的外观:您应该使用您真正关心的过滤器来构建查询,拆分查询集的创建,这仍然只会导致对db的一次调用,它只是更干净而已
overtime_data = Overtime.objects.all()
location = form.cleaned_data.get('location')
if location:
overtime_data = overtime_data.filter(location=location)
# continue for other params.
您还使用了
form.data
而不是cleaned\u data
,这意味着您没有使用经过验证的数据。1)ModelForms的存在可以帮助您从模型构建表单。如果要重新定义这么多字段,为什么要使用ModelForm
?加班
模型中的那些字段是否已经存在?2) 将字段
属性设置为表单中所需模型属性的列表(或元组),例如字段=['location'、'Timeout\u type'、'dateStart'、'dateEnd']
。请仔细阅读“它们不起作用”包含哪些内容?错误?无效结果?@Pynchia主要是因为我还在发展我的知识,我不确定元组在这种情况下会更好。你能解释为什么一个元组会改变这个结果吗?所有原始字段都存在于加班模型中。我认为引用这些字段的第二个表单是在表单中创建筛选器的最佳方法。@请不要说有错误。过滤器不起作用,显示所有内容,就好像没有设置过滤器一样。我说的是列表或元组。功能上没有区别。您的代码多次错误地为字段
(和字段
可能是输入错误)赋值,覆盖了以前的每个赋值。如果要完全重新定义表单中的字段,请使用表单
。否则,如果要避免编写两次代码,请使用modelForm
,并简单地指定模型中的哪些字段应用于构建表单。请阅读文档,然后回复您!谢谢。我真的很抱歉耽搁了你,我出城几天了,我刚刚开始尝试这个解决方案。实际上,我对应该将视图放在哪里有点困惑,我假设查询集在中,如果表单\u是有效的()
对吗?我正在尝试你推荐的方法,但我还是得到了同样的结果issue@AaronLayfield-是的,它基本上取代了您现有的加班数据
所在的位置。。。但这并不能解决问题,更重要的是你需要使用cleaned_data
而不是data
我相信是的,我尝试过使用cleaned data,但没有解决问题,你推荐的更新/方法也不会改变结果,尽管我可以肯定地看到这背后的逻辑。似乎无论我更改什么,因为字段设置为“无”,它将返回所有内容。如果没有,我需要某种方式来表示,然后更改值以返回所有
<div class="col-md-3">{{ form.location }}
{{ form.dateStart }} <p>To</p>
{{ form.dateEnd }}
{{ form.overtime_type }}
</div>
overtime_data = Overtime.objects.all()
location = form.cleaned_data.get('location')
if location:
overtime_data = overtime_data.filter(location=location)
# continue for other params.