【问题标题】:how to alter/change the post data in django UpdateView如何更改/更改 django UpdateView 中的帖子数据
【发布时间】:2013-12-19 05:21:06
【问题描述】:

我正在使用 django 更新视图来为我的 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 的值为空,我需要分配一些默认值并提交最新的查询

我也知道 Querydict 是可变的,但是因为确定我需要编辑 POST 数据,在 submitting/saving to database 之前,我需要将该 querydict 设为 dict,然后对其进行编辑,然后转换回 querdict

所以毕竟我的问题是

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

【问题讨论】:

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


    【解决方案1】:

    QueryDict 在创建 .copy() 后是可变的。请参阅docs

    更新示例:

    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)
    

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

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

    【讨论】:

    • 实际上,我只是不想使用 ModelForm,因为在我的情况下,ModelForms 已经面临一些问题。那么最后我们可以在上面的UpdateView中编辑post数据了吗?
    • k 这很有帮助,但是如果我需要用全新的 querydict 替换 request.POST 怎么办?有没有办法用全新的 querydict 替换 request.POST ?比如 request.POST = new_querdict
    • 是的。 request.POST = QueryDict()。 :)
    猜你喜欢
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多