如何在django UpdateView中更改/更改发布数据

时间:2013-12-03 08:36:16

标签: django post request django-class-based-views

我正在使用django update view查看我的model/records编辑内容,如下所示

class EditProductView(LoginRequiredMixin, UpdateView):
    model = Product
    def get_template_names(self):

        return ['website/product/edit_product.html']

    def get_success_url(self):

        return reverse('product_details', args=[self.kwargs['pk']])

    def get_context_data(self, **kwargs):
        publisher = Publisher.objects.get(product__id=self.kwargs['pk']) 
        context = super(EditProductView, self).get_context_data(**kwargs)
        context.update(
           {
            'publisher':publisher,
            }
          )
        return context        

edit_product =  EditProductView.as_view()   

所以我想要/尝试做的就是在提交表单之前改变(添加一些数据,根据网站功能编辑已提交的数据)POST数据,

所以我知道UpdateView有一些方法def def post(self, request, *args, **kwargs):,但我不确切知道如何使用它

假设下面是我正在获取的request.POST数据

<QueryDict: {u'product_name': [u'Biscuit'], u'product_price': [u'1000'], u'product_tag': [u'']}>

所以现在我想改变上面的QueryDict,如果product_tag的值为空,我需要指定一个默认值并使用最新的querdict提交

我也知道Querydict是可变的,但是因为我确实需要编辑POST数据,在submitting/saving to database之前,我需要将这个querydict作为dict,然后编辑它,然后转换回querdict

所以最重要的是我的问题是

  1. 如何在提交/保存到数据库之前更改POST中的UpdateView数据
  2. post方法是否有效?

1 个答案:

答案 0 :(得分:9)

QueryDict创建.copy()后,class SomeUpdateView(UpdateView): def post(self, request, **kwargs): request.POST = request.POST.copy() request.POST['some_key'] = 'some_value' return super(SomeUpdateView, self).post(request, **kwargs) 是可变的。请参阅docs

更新示例:

ModelForm

Here是关于该主题的更广泛的讨论。

此外,这不应该在form_class子类中完成吗?您当然知道可以在UpdateView中将自定义表单设置为{{1}}。这样的逻辑通常需要单元测试,单元测试逻辑就更容易了。