【问题标题】:Django - alter post data in CreateViewDjango - 在 CreateView 中更改帖子数据
【发布时间】:2017-08-22 16:50:15
【问题描述】:

我正在尝试更改发布请求中的值,但收到以下错误:

IntegrityError: null value in column "owner" violates not-null constraint
DETAIL:  Failing row contains (30, 123, G, null) <--> (index, number, type, owner)

表单本身:

<form method="post">
    {% csrf_token %}
    {{form.number}}
    {{form.type}}
    <input type="hidden" value="{{variable}}" name="owner">
    <button type="submit">Save</button>
</form>

request.POST 数据:

<QueryDict: {'csrfmiddlewaretoken': ['TN3yNiGcvAso6V1UYZDHpyIQ1sNTMqDICPSqX2sftVpZfX6drambOkzoGBECLKcN'], 'number': ['123'], 'type': ['G'], 'owner': ['']}>

修改数据:

class NodeCreateView(CreateView):

model = Node
form_class = NodeCreateForm
...

def post(self, request, **kwargs):
    request.POST = request.POST.copy()
    request.POST['owner'] = 2
    return super(NodeCreateView, self).post(request, **kwargs)

更新后的 POST 数据:

<QueryDict: {'csrfmiddlewaretoken': ['TN3yNiGcvAso6V1UYZDHpyIQ1sNTMqDICPSqX2sftVpZfX6drambOkzoGBECLKcN'], 'number': ['123'], 'type': ['G'], 'owner': [2]}>

我哪里错了?

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    您不必将所有者作为隐藏输入包含在内,也不必像这样修改帖子数据。

    首先,从您的表单中排除所有者:

    class NodeCreateForm(forms.ModelForm):
        class Meta:
            model = Node
            exclude = ['owner']
    

    然后在您的视图中,覆盖form_valid 方法,并在实例上设置owner_id

    class NodeCreateView(CreateView):
        model = Node
        form_class = NodeCreateForm
    
        def form_valid(self, form):
            form.instance.owner_id = 2
            return super(NodeCreateView, self).form_valid(form)
    

    我假设 owner 是外键,否则设置为 form.instance.owner = 2

    【讨论】:

    • 像魅力一样工作。谢谢。
    【解决方案2】:

    您使用copy() 正确地改变了request.POST,但是将修改后的请求对象传递给super().post() 是一种误导。如果您跟随调用链回到视图实际访问请求对象的位置,它不会使用您修改的请求,而是使用未修改的请求作为self.request。见here

    可能有更好的方法来完成你正在做的任何事情,但如果它不是永久性的,你可以在你的NodeCreateView 中覆盖get_form_kwargs()

    【讨论】:

      【解决方案3】:

      为您的情况更好地覆盖get_form_kwargs,例如:

      def get_form_kwargs(self):
          kwargs = super(NodeCreateView).get_form_kwargs()
          kwargs['data'].update({'owner': 2})
          return kwargs
      

      【讨论】:

        猜你喜欢
        • 2013-12-19
        • 2012-09-09
        • 1970-01-01
        • 2021-12-27
        • 2021-10-17
        • 2017-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多