我是python的新手,它试图防止将未知值推送到名为Tasks的数据库表中,而这不是我的其他名为Terms的表中的值(使用term_parent ==“ site_type”通过site_type查询)。>
当我尝试循环“条款”表中的数据并针对输入task_site_type
对其进行验证时,如果只选择所有项目并且交换了{{1} }语句我得到了错误:if not
Flask-sqlalchemy请求需要循环的数据。
typeerror: 'in <string>' requires string as left operand, not list
从选中的复选框中抓取POSTED列表。
terms_site_type = Terms.query.filter(Terms.term_parent == "site_type").all()
我必须验证的最近的东西
没有错误-当我全选时,
if request.method == 'POST':
# Gather Form Input
task_site_type = request.form.getlist('task_site_type')
e.g selecting two checkboxes task_site_type = ['Test1', 'All']
与task_site_type
terms_site_type
错误 形成此设置,该设置应验证针对数据库“条款”循环发布的内容
for term in terms_site_type:
if not term.term_title in task_site_type:
errors['task_site_type_list'] = 'Please select from list'
e.g term.term_title(list)
Test1
Test2
All
task_site_type - ['Test1', 'Test2' 'All']
答案 0 :(得分:0)
来自...的错误
if not task_site_type in term.term_title:
errors['task_site_type_list'] = 'Please select from list'
...是有效的错误,因为in
中的左操作数是list
,而右操作数是string
。反之亦然。
同样,在您以前的代码中,我相信您将遍历Tasks
并检查来自Terms
的列表,因为这是正确的验证方法。
正确的方法如下:
for task in task_site_type:
if not task in terms_site_type:
errors['task_site_type_list'] = 'Please select from list'
答案 1 :(得分:0)
我的第一个答案就可以了,但是更好的方法可能是同时获得两个列表,将它们转换为集合,然后减去任务减去术语。
您可以定义如下函数:
def Diff(li1, li2):
return (list(set(li1) - set(li2)))
Diff(tasks, terms)
# if the resulting list is empty then the validation shall succeed
参考:https://www.geeksforgeeks.org/python-difference-two-lists/
最后, 更好的方法是将输入列表(即任务)推入查询过滤器本身,以便将验证带到数据库本身,而不是在代码中进行验证。