【发布时间】:2017-06-10 23:18:19
【问题描述】:
我正在开发 django 中的批量更新功能。我有一个显示数据库中数据的表,用户选择他们想要编辑的对象。选择后,他们单击“批量更新”按钮,然后将它们带到 django ModelForm。此页面的部分视图是这样的:
def BulkUpdate(request):
c = {}
c.update(csrf(request))
if request.method == "POST":
pks = request.POST.getlist("selection")
selected_objects = mymodel.objects.filter(pk__in=pks)
form = BulkUpdateForm(request.POST)
print (selected_objects)
if form.is_valid():
gender = form.data['gender']
print (gender)
print (selected_objects)
return render(request, 'bulkUpdate.html', {'form': form })
第一个 print (selected_objects) 成功打印了从 QuerySet 上的先前模板中选择的所有对象。但是第二个print (selected_objects) 返回一个空白查询集。例如,如果选择了三个对象,我的终端将打印
<QuerySet [<model: model object>, <model: model object>, <model: model object>]>
但在提交有效的表格后,它会打印出来
<QuerySet []>
<QuerySet []>
两个因为我在我的代码中打印了两次..
我的主要问题是如何将这三个对象放入我的 form.is_valid() 函数中。我希望我的变量 selected_objects 在两个调用中都以相同的方式打印。任何帮助或建议都很棒。感谢您的宝贵时间。
【问题讨论】:
-
不可能是这样的。您打印相同的查询集两次,结果将是相同的。我敢打赌
form.is_valid()是 False 并且您的代码中的其他地方还有 2 个打印。 -
不幸的是,事实并非如此。我希望是的。我知道该函数正在被调用,因为我的性别输入被返回。我认为是当我最初点击批量更新按钮将我带到表单页面时,它会抓取对象,但是当我提交表单时它不再可以访问被选中的对象?它只返回一个空的查询集。我在想也许使用令牌?但我没有太多的象征性经验,我不确定这是否是一种安全的处理方式。
-
print(pks)的值是多少?如果它是一个空列表,那么您在提交表单时没有在 POST 数据中包含selection。 -
顺便说一句,您可以从代码中删除
c = {}和c.update(csrf(request))。使用render快捷方式时,无需手动包含 csrf 令牌。 -
感谢您的回复以及有关删除该 sn-p 的提示。对于pks,情况类似。当我最初单击“批量更新”将我带到表单时,它会打印一个包含所选对象的 pk 的列表。当我提交有效表单时,pks 会打印一个空列表。您如何建议我在提交表单时在 POST 数据中包含
selection?
标签: django django-forms django-views