【问题标题】:pass object variable to ' form.is_valid(): ' function in django将对象变量传递给'form.is_valid():'django中的函数
【发布时间】: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


【解决方案1】:
def BulkUpdate(request):
    if request.method == "POST":
        pks = request.POST.getlist("selection")
        form = BulkUpdateForm(request.POST)
        pk_string = "/".join(str(i) for i in pk_list)
        if form.is_valid():
            url = request.path
            pk_mod=url[33:].split('/')
            objects = mymodel.objects.filter(pk__in=pk_mod)
            gender = form.data['gender']
            for i in objects:
                i.gender = gender
                i.save()
                print('done')
        return HttpResponseRedirect(pk_string)
    else:
        form = BulkUpdateForm(request.POST)
        return render(request, 'bulkUpdate.html', {'form':form })

我成功地使用此方法获取所选对象的 pk,将其带到表单模板,同时将 pk 保存在 url 中,然后使用 url 剥离 pk 并使用我以前使用的方法过滤我的对象。从那里,在我的BulkUpdateForm() 中输入gender 的任何输入都将替换所有选定对象的性别字段。谢谢大家的帮助,希望我的sn-p以后能帮到大家。

【讨论】:

    猜你喜欢
    • 2015-07-02
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多