Django在CreateVi中修改post数据

2024-10-01 13:42:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

形式本身:

^{pr2}$

在请求.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]}>

我哪里出错了?在


Tags: 数据selfnumberrequesttypepostnullkwargs
3条回答

通过使用copy()request.POST进行了正确的变异,但是将修改后的请求对象传递到super().post()中是有误导性的。如果您沿着调用链回到视图实际访问请求对象的位置,它不会使用您修改过的请求,而是将未修改的请求用作self.request。见here。在

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

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

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

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

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

^{pr2}$

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

对于您的情况,重写get_form_kwargs的更好方法,例如:

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

相关问题 更多 >