Skip to main content
 首页 » 编程设计

python之Django之在 CreateView 中更改发布数据

2025年05月04日24linjiqin

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

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> 

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

我哪里错了?

请您参考如下方法:

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

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

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

然后在您的 View 中,覆盖 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。