我有一个用户想要编辑帖子的编辑视图:
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中的字段并只更改内容字段?
答案 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
。