2016-03-21 28 views
2

Yeni bir Comment tabanına ekleyen bir yöntemim var ve bunu yaptıktan sonra, bir önceki gönderiye geri dönebilir, bu da herhangi biri olabilir. URL'ye id için ileterek okunduğunu Bununla beraberGeçirilecek URL parametrelerini vermek

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

, sayfa önceki Post geri yönlendirilir: Yani, bunu yapmak için, aşağıdaki kural yaptı.

Sorun şu anda formun geçerli olmaması durumunda. Hata mesajlarını görüntülemek istiyorum, ama şu anki haliyle, formun yeniden oluşturulduğunu, herhangi bir mesajı silindiğini düşünüyorum. Yani, else koşulunda, yeniden yönlendirmek, yeniden oluşturmak ve iletileri göstermek istiyorum.

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

Ama sonra, geri bakılmaksızın ben aynı sayfada, parametrede id almak gerekir: Ben bunu böyle yaptık. işlevinde yaptığım gibi post_id'u geçmem gerekiyor, ancak bir yol bulamıyorum.

Bütün bu yöntem: URL ile, onun id bağlı Post görüntülemek için kullanılan

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') 

Benim sınıf görünüm:

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

Ve 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() 
    }) 

cevap

1

Formu bir contex olarak geçiriyor olmalısınız t değişken (içerik parametresi).

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

Ayrıca, nesneleri yeniden düzenlemek isteyebilirsiniz. Yorum işleme mantığını GetPostView ile birleştiririm. get'da sahip olduğunuz mantığı get_context_data'a aktarmaya çalışıyorum. Bu işlem, get/post oluştururken kullanılacaktır. Sonra post yöntemini (yerine, buna post numaralı telefondan çağırabilirsiniz) ekleyin. Burada, sayfayı olduğu gibi oluşturmanız gerekiyorsa, post yönteminin super sürümünü aramayı deneyin.

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 
     } 

Yasal Uyarı: Bu kodu kullanmıyorum, bu yüzden aptalca bir hata olasılığı vardır. Onları işaretlerseniz, onu temizlemeye çalışırım.

+0

Neredeyse. Mesaj nihayet görüntüleniyor, ancak hala "post_id" mesajını almam gerekiyor. Bu sayfa şu url '/ post/ /' ve sayfayı aynı sayfada göstermem gerekiyor. – mfgabriel92

+0

Peki, form doğrulama hatalarınızı oluşturduğunuzda, gönderiyi de istersiniz? Bu yöntemde yazı için hiçbir şey görmüyorum (yönlendirme dışında). Bunun için başka bir yöntem var mı? – bpscott

+0

Evet, iletiyi url'deki kimliğe göre görüntülemek için sınıf görünümü. Benim düzenlenmiş soruma bak, lütfen. – mfgabriel92

İlgili konular