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

标签 python django django-forms

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

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

关于python - Django - 在 CreateView 中更改发布数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45823156/

相关文章:

python - 如何在仍然使用 unique = True 的同时在我的 ModelForm 中允许空字段?

python - 如何为多个值索引 python df

python - re.findall 行为怪异

python - 在Python中解析日期字符串

python - Django 如何从过滤数据中设置或更新数据

django - 允许在 ModelAdmin 上进一步覆盖 save_formset

javascript - 如何将数据从 Python 脚本发送到 JavaScript,反之亦然?

mysql - Django Mysql 连接池

python - Django - 如何在登录时设置默认值 request.session ?

html - 如何在页面中心设置我的 Django 表单