Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django设置ModelForm字段,但不将其包含在表单中_Django_Forms - Fatal编程技术网

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

Django设置ModelForm字段,但不将其包含在表单中,django,forms,Django,Forms,在我的应用程序中,我有Users创建Post对象。每个Post都有一个User class Post(models.Model): user = models.ForeignKey(User, on_delete = models.CASCADE) ... 我想创建一个用于编辑和提交的提交后表单,所以我计划使用Django的ModelForm功能 class PostForm(ModelForm): class Meta: model = Post

在我的应用程序中,我有
User
s创建
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' 
那么用户将不会在表单提交时设置。我通过制作一个自定义表单和更新post字段来解决这个问题

def submit_view(request):
    .... 
    request.POST = request.POST.copy()
    request.POST.update({
        'user' : request.user.id
    })

    form = PostForm(request.POST, request.FILES)
    .... 
但是,我失去了自动UI生成和表单验证,这在某种程度上违背了
表单
类的目的。有人能告诉我设置
用户
字段而不将其包含在
表单
中的惯用方法吗

试试这个视图:

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()
尝试以下视图:

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>

{%csrf_令牌%}
{{form.as_p}}

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>

{%csrf_令牌%}
{{form.as_p}}

在这种情况下,我可以从模型表单中排除
用户
字段吗?是的,如果您不想渲染它,您应该这样做!用户直接存储在模型实例中!谢谢,出于某种原因,我认为它会比这更复杂…在这种情况下,我可以从模型表单中排除
用户
字段吗?是的,如果不希望渲染它,您应该这样做!用户直接存储在模型实例中!谢谢,出于某种原因,我认为事情会比这更复杂。。。