2017-06-19 47 views
0

在我的應用程序中,我有User s創建Post對象。每個PostUserDjango設置ModelForm字段不包括它的形式

class Post(models.Model): 
    user = models.ForeignKey(User, on_delete = models.CASCADE) 
    ... 

我想創建用於編輯和提交提交後的形式,所以我打算使用Django的ModelForm功能。

class PostForm(ModelForm): 
    class Meta: 
     model = Post 
     fields = "__all__" 

但是,如果我這樣做,那麼查看錶單的人將能夠設置作者是誰。我想確保由此產生的user字段是他們。但是,如果我排除了的ModelForm的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中?

回答

3

嘗試這樣的觀點:

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() 
+0

在這種情況下,我可以從ModelForm中排除'user'字段嗎? –

+0

是的,你應該如果你不想它被渲染!用戶直接存儲在模型實例中! –

+0

謝謝,由於某種原因,我認爲它會比這更復雜... –

0

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>