Python Django-在CreateView中更改post数据

Python Django-在CreateView中更改post数据,python,django,django-forms,Python,Django,Django Forms,我试图更改post请求中的值,但出现以下错误: IntegrityError: null value in column "owner" violates not-null constraint DETAIL: Failing row contains (30, 123, G, null) <--> (index, number, type, owner) 更新后的邮政数据: <QueryDict: {'csrfmiddlewaretoken': ['TN3yNiGcvAs

我试图更改post请求中的值,但出现以下错误:

IntegrityError: null value in column "owner" violates not-null constraint
DETAIL:  Failing row contains (30, 123, G, null) <--> (index, number, type, owner)
更新后的邮政数据:

<QueryDict: {'csrfmiddlewaretoken': ['TN3yNiGcvAso6V1UYZDHpyIQ1sNTMqDICPSqX2sftVpZfX6drambOkzoGBECLKcN'], 'number': ['123'], 'type': ['G'], 'owner': ['']}>
<QueryDict: {'csrfmiddlewaretoken': ['TN3yNiGcvAso6V1UYZDHpyIQ1sNTMqDICPSqX2sftVpZfX6drambOkzoGBECLKcN'], 'number': ['123'], 'type': ['G'], 'owner': [2]}>
我哪里出错了?

您使用copy正确地修改了request.POST,但将修改后的request对象传递到super.POST会产生误导。如果您沿着调用链返回视图实际访问请求对象的位置,那么它不是使用您修改的请求,而是使用未修改的请求作为self.request。看

也许有更好的方法来完成你正在做的事情,但如果它不是永久性的,你可以在你的nodecreate视图中覆盖get_form_kwargs

您使用copy正确地修改了request.POST,但将修改后的request对象传递到super.POST会产生误导。如果您沿着调用链返回视图实际访问请求对象的位置,那么它不是使用您修改的请求,而是使用未修改的请求作为self.request。看


也许有更好的方法来完成你正在做的事情,但如果它不是永久性的,你可以在你的nodecreate视图中覆盖get_form_kwargs

对于您的情况,覆盖get_form_kwargs的更好方法,例如:

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

对于您的情况,覆盖get_form_kwargs的更好方法,例如:

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

您不必将所有者包含为隐藏输入,也不必像这样修改post数据

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

class NodeCreateForm(forms.ModelForm):
    class Meta:
        model = Node
        exclude = ['owner']
然后在您的视图中,重写form\u valid方法,并在实例上设置所有者\u 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)

我假设所有者是外键,否则设置form.instance.owner=2。

您不必将所有者作为隐藏输入,也不必像这样修改post数据

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

class NodeCreateForm(forms.ModelForm):
    class Meta:
        model = Node
        exclude = ['owner']
然后在您的视图中,重写form\u valid方法,并在实例上设置所有者\u 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)

我假设所有者是外键,否则设置form.instance.owner=2。

就像一个符咒。谢谢,很有魅力。非常感谢。