2017-06-19 1 views
0

In meiner App habe ich User s erstellen Post Objekte. Jede Post hat eine UserDjango Set ModelForm Feld ohne es in der Form

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

ich einen Post-Anmeldeformular für die Bearbeitung und Einreichung erstellt werden soll, so plane ich Djangos Modelform Funktion zu nutzen.

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

Allerdings, wenn ich das tue, dann wer auch immer die Form wird anschaut einstellen können, die die Post Autor ist. Ich möchte sicherstellen, dass das resultierende user Feld ihnen gehört. Aber, wenn ich schließe das user Feld aus der Modelform,

class PostForm(ModelForm): 
    class Meta: 
     model = Post 
     exclude = 'user' 

dann wird der Benutzer nicht auf Formular-Vorlage festgelegt werden. Ich habe meinen Weg, um diese gehackt durch ein benutzerdefiniertes Formular zu machen und die Aktualisierung des Postfeld

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

    form = PostForm(request.POST, request.FILES) 
    .... 

aber dann verliere ich automatische UI Generation und Formularvalidierung, die in gewisser Weise den Zweck der Form Klasse besiegt. Könnte mir jemand auf die idiomatische Art und Weise zeigen, das Feld user einzustellen, ohne es in die Form aufzunehmen?

Antwort

3

Versuchen Sie, diese Ansicht:

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

Kann ich in diesem Fall das Feld 'user' aus der ModelForm ausschließen? –

+0

Ja, Sie sollten, wenn Sie nicht möchten, dass es gerendert wird! Der Benutzer wird direkt in der Modellinstanz gespeichert! –

+0

danke, aus irgendeinem Grund dachte ich, es würde komplizierter sein als das ... –

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>