我正在尝试更改帖子请求中的值,但收到以下错误:
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]}>
我哪里错了?
答案 0 :(得分:4)
您不必将所有者包含为隐藏输入,也不必像这样修改帖子数据。
首先,从表单中排除所有者:
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)
我假设所有者是外键,否则设置为form.instance.owner = 2
。
答案 1 :(得分:3)
您正在使用request.POST
正确改变copy()
,但将修改后的请求对象传递给super().post()
会产生误导。如果您按照调用链回到视图实际访问请求对象的位置,它不会使用您修改的请求,而是使用未修改的请求self.request
。见here。
可能有更好的方法来完成你正在做的任何事情,但如果它不是永久性的,你可以覆盖get_form_kwargs()
中的NodeCreateView
。
答案 2 :(得分:1)
为您的案例更好地覆盖get_form_kwargs
,例如:
def get_form_kwargs(self):
kwargs = super(NodeCreateView).get_form_kwargs()
kwargs['data'].update({'owner': 2})
return kwargs