在我的应用程序中,我User
创建了Post
对象。每个Post
都有一个User
class Post(models.Model):
user = models.ForeignKey(User, on_delete = models.CASCADE)
...
我想创建一个提交后表单进行编辑和提交,所以我计划使用 Django 的 ModelForm 功能。
class PostForm(ModelForm):
class Meta:
model = Post
fields = "__all__"
但是,如果我这样做,那么查看表单的人将能够设置帖子作者是谁。我想确保生成的user
字段是它们。但是,如果我从模型表单中排除user
字段,
class PostForm(ModelForm):
class Meta:
model = Post
exclude = 'user'
则不会在表单提交时设置用户。我已经通过制作自定义表单和更新帖子字段来解决这个问题
def submit_view(request):
....
request.POST = request.POST.copy()
request.POST.update({
'user' : request.user.id
})
form = PostForm(request.POST, request.FILES)
....
但随后我丢失了自动 UI 生成和表单验证,这在某种程度上违背了 Form
类的目的。 有人可以指出我设置user
字段而不将其包含在Form
中的惯用方法吗?
试试这个视图:
def submit_view(request):
form = PostForm(request.POST or None)
if form.is_valid():
new_post = form.save(commit=False)
new_post.user = request.user
new_post.save()
view.py
from django.views.generic import CreateView
from .models import Post
class PostCreate(CreateView):
model = Post
template_name ="new_Post_form.html"
fields = ['text']
def form_valid(self, form):
object = form.save(commit=False)
object.user = self.request.user
object.save()
return super(PostCreate, self).form_valid(form)
def get_success_url(self):
return "/"
url.py
url(r'^newpost$',views.PostCreate.as_view(),name='post_new',),
new_post_form.html
<form method="post" enctype="multipart/form-data" class="form" action="newpost" id="new-post-form">
<div class="modal-body">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</div>