更新模型实例时,获取“此字段是必需的”错误

时间:2017-02-28 11:27:44

标签: python django django-forms

我有一个用户想要编辑帖子的编辑视图:

def edit(request, id):
    post = get_object_or_404(Post, id=id)
    edit_form = PostForm(request.POST or None, instance=post)
    if edit_form.is_valid():
        instance = edit_form.save(commit=False)
        instance.save(update_fields=['content'])
        return HttpResponseRedirect('/')
    else:
        print(edit_form.errors)
        edit_form = PostForm(instance=post)
    context = {
        'edit_form': edit_form,
        'form_post': post
    }
    return render(request, 'edit.html', context)

当用户编辑帖子时,我只希望他们能够编辑1个字段(内容),所以我只在我的模板中呈现该表单字段(预先填充了之前的post.content。其他字段只是对象的字段(不是表单/无法编辑)。

...
<form method="post" action="" enctype="multipart/form-data">{% csrf_token %}    

<h1>{{ form_post.title }}</h1>

<p>{{ edit_form.content}}</p>

<p>{{ form_post.category }}</p>

</form>
...

这是我的Post模型:

class Post(models.Model):
    ...
    title = models.TextField(max_length=76)
    content = models.TextField(null=False, default='')
    category = models.CharField(max_length=20, choices=CATEGORY_CHOICES, default='1')

提交修改表单后,form_errors会返回此信息:

<ul class="errorlist">
    <li>title<ul class="errorlist"><li>This field is required.</li></ul></li>
    <li>category<ul class="errorlist"><li>This field is required.</li></ul</li>
</ul>

为什么会这样?不:

instance = edit_form.save(commit=False)
instance.save(update_fields=['content'])

保留orignal Post中的字段并只更改内容字段?

1 个答案:

答案 0 :(得分:1)

如果您只想要编辑某些字段,则应在模型表单中设置fields。如果您在其他视图中使用PostForm而无法修改fields,请创建新表单。

class EditPostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['content']

如果您愿意,可以继承PostForm

class EditPostForm(PostForm):
    class Meta(PostForm.Meta):
        fields = ['content']

然后更新您的修改视图,使用EditPostForm代替PostForm