将对象变量传递给' form.is_valid():' django中的功能

时间:2017-01-25 16:58:49

标签: django django-forms django-views

我正在研究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。例如,如果选择了三个对象,我的终端将打印

<QuerySet [<model: model object>, <model: model object>, <model: model object>]>

但提交有效表格后会打印

<QuerySet []> <QuerySet []>

两个,因为我在我的代码中打印了两次..

我的主要问题是如何将这三个对象放入我的form.is_valid()函数中。我希望我的变量selected_objects在两个调用中以相同的方式打印。任何帮助或建议都是惊人的。谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

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并使用我之前使用的方法过滤我的对象。从那里开始,任何放入我genderBulkUpdateForm()的输入都将替换所有选定对象的性别字段。感谢大家的帮助,希望我的片段可以在以后帮助某人。