Django 设置了 ModelForm 字段,但没有将其包含在表单中



在我的应用程序中,我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>

最新更新