2016-03-21 11 views
2

Ich habe eine Methode, die eine neue Comment in die Basis einfügt, und nachdem es dies getan hat, leitet es zurück zum vorherigen Post, der beliebig sein kann. Also, das zu tun, habe ich die folgende Regel:Übergeben von URL-Parametern zum Rendern

return redirect(reverse('blog:post', args = (post_id,)))

Damit wird die Seite zurück zum vorherigen Post umgeleitet gelesen werden, durch die id an die URL übergeben.

Das Problem ist jetzt, wenn das Formular nicht gültig ist. Ich möchte Fehlermeldungen anzeigen, aber ich denke, dass das Formular jetzt neu erstellt wird und jede Nachricht gelöscht wird. Also, in der else Bedingung möchte ich, anstatt umzuleiten, es wieder rendern und die Nachrichten zeigen. Ich habe es so gemacht:

return render(request, 'blog/post.html', post_id = post_id)

Aber dann muss ich wieder auf die gleiche Seite bekommen war ich, unabhängig von der id im Parameter. Ich muss die post_id übergeben, wie ich in der redirect Funktion tat, aber ich kann einen Weg nicht finden.

Das ist die ganze Methode:

def write_comment(request, post_id): 
    """ 
    Write a new comment to a post 
    """ 
    form = CommentForm(request.POST or None) 

    if form.is_valid(): 
     post = Post.objects.get(pk = post_id) 
     post.n_comments += 1 
     post.save() 

     comment = Comment() 
     comment.comment = request.POST['comment'] 
     comment.created_at = timezone.now() 
     comment.modified_at = timezone.now() 
     comment.post_id = post_id 
     comment.user_id = 2 
     comment.save() 

     return redirect(reverse('blog:post', args = (post_id,))) 
    else: 
     # Need to pass the parameter here, in order to not recreate the form 
     return render(request, 'blog/post.html') 

verwendet Meine Klassenansicht durch die URL auf seiner id je die Post, anzuzeigen:

url(r'^post/(?P<id>[0-9]+)/$', views.GetPostView.as_view(), name = 'post'), 

Und die GetPostView:

class GetPostView(TemplateView): 
    """ 
    Render the view for a specific post and lists its comments 
    """ 
    template_name = 'blog/post.html' 

    def get(self, request, id): 
     return render(request, self.template_name, { 
      'post': Post.objects.get(pk = id), 
      'comments': Comment.objects.filter(post = id).order_by('-created_at'), 
      'form': CommentForm() 
    }) 

Antwort

1

Sie sollten das Formular als contex übergeben t Variable (Kontextparameter).

render(request, 'blog/post.html', context={"form": form}) 

Vielleicht möchten Sie auch Dinge neu organisieren. Ich würde die Kommentarverarbeitungslogik mit GetPostView kombinieren. Ich würde versuchen, die Logik, die Sie in get haben, auf get_context_data zu verschieben, die beim Rendering Get/Post verwendet wird. Dann fügen Sie eine post Methode (anstelle von write_comment, obwohl Sie das sicher von post nennen könnten). Wenn Sie die Seite so rendern möchten, wie sie ist, rufen Sie einfach die super-Version der post-Methode auf.

class GetPostView(TemplateView): 
    """ 
    Render the view for a specific post and lists its comments 
    """ 
    template_name = 'blog/post.html' 

    def get(self, request, id): 
     self.request = request 
     self.id = id 

     return super(GetPostView, self).get(request, self.id) 

    def post(self, request, id): 
     """ 
     Process comment 
     """ 
     self.form = CommentForm(request.POST or None) 

     if self.form.is_valid(): 
      post = Post.objects.get(pk = id) 
      post.n_comments += 1 
      post.save() 

      comment = Comment() 
      comment.comment = request.POST['comment'] 
      comment.created_at = timezone.now() 
      comment.modified_at = timezone.now() 
      comment.post_id = id 
      comment.user_id = 2 
      comment.save() 

      return redirect(reverse('blog:post', args = (id,))) 
     else: 
      return self.get(request, id) 

    def get_context_data(self, **kwargs): 
     form = self.form if hasattr(self, 'form') else CommentForm() 

     return { 
       'post': Post.objects.get(pk = self.id), 
       'comments': Comment.objects.filter(post = self.id).order_by('-created_at'), 
       'form': form 
     } 

Haftungsausschluss: Ich führe diesen Code nicht, also ist ein dummer Fehler wahrscheinlich. Wenn Sie darauf hinweisen, werde ich versuchen, es aufzuräumen.

+0

Fast. Die Nachricht wird endlich angezeigt, aber ich muss noch die 'post_id' erhalten. Die Seite ist diese URL '/ post/ /', und ich muss die Seite auf dieser Seite rendern. – mfgabriel92

+0

Also, wenn Sie die Formularvalidierungsfehler rendern, möchten Sie den Beitrag auch? Ich sehe nichts für die Post in dieser Methode (abgesehen von der Weiterleitung). Gibt es eine andere Methode dafür? – bpscott

+0

Ja, die Klassenansicht zum Anzeigen des Posts gemäß der ID in der URL. Schau bitte meine bearbeitete Frage. – mfgabriel92

Verwandte Themen