我试图更改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]}>
我哪里出错了?在
通过使用
copy()
对request.POST
进行了正确的变异,但是将修改后的请求对象传递到super().post()
中是有误导性的。如果您沿着调用链回到视图实际访问请求对象的位置,它不会使用您修改过的请求,而是将未修改的请求用作self.request
。见here。在可能有更好的方法来完成您正在做的任何事情,但是如果它不是永久的,您可以在您的
NodeCreateView
中重写get_form_kwargs()
。在您不必将所有者包含为隐藏输入,也不必像这样修改post数据。在
首先,将所有者从表单中排除:
然后在您的视图中,重写
^{pr2}$form_valid
方法,并在实例上设置owner_id
:我假设所有者是一个外键,否则设置
form.instance.owner = 2
。在对于您的情况,重写
get_form_kwargs
的更好方法,例如:相关问题 更多 >
编程相关推荐