2016-03-21 2 views
2

У меня есть метод, который вставляет в базу новый Comment, и после этого он перенаправляет обратно на предыдущий пост, который может быть любым. Таким образом, чтобы сделать это, я сделал следующее правило:Передача параметров URL для визуализации

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

С ним, страница перенаправляется обратно к предыдущему Post считывании, переходя к URL-id.

Проблема сейчас, если форма недействительна. Я хочу отображать сообщения об ошибках, но я думаю, что так, как сейчас, форма воссоздается, стирая любое сообщение. Итак, в состоянии else я хочу, вместо того, чтобы перенаправлять, снова показывать его и показывать сообщения. Я сделал это так:

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

Но тогда, мне нужно, чтобы вернуться к той же странице, я был, независимо от id в параметре. Мне нужно передать post_id, как и в функции redirect, но я не могу найти способ.

Это весь метод:

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

вид Мой класс, используемый для отображения Post, в зависимости от его id, по адресу:

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

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

ответ

1

Вы должны передать форму как контекс t variable (параметр контекста).

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

Возможно, вам также захочется реорганизовать вещи. Я бы объединил логику обработки комментариев с GetPostView. Я бы постарался переместить вашу логику в get до get_context_data, которая будет использоваться при рендеринге get/post. Затем добавьте метод post (вместо write_comment, хотя вы, безусловно, можете назвать это от post). Там, если вам нужно отобразить страницу как есть, просто попробуйте позвонить super версии метода post.

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 
     } 

Отказ от ответственности: Я не использую этот код, так что, вероятно, будет глупая ошибка. Если вы укажете их, я попробую очистить его.

+0

Почти. Сообщение наконец отображается, но мне все равно нужно получить 'post_id'. Страница - это url '/ post/ /', и мне нужно отобразить страницу на этой же странице. – mfgabriel92

+0

Итак, когда вы визуализируете ошибки проверки формы, вы также хотите опубликовать сообщение? Я ничего не вижу для сообщения в этом методе (кроме перенаправления). Есть ли другой способ? – bpscott

+0

Да, представление класса для отображения сообщения в соответствии с идентификатором в URL-адресе. Посмотрите мой отредактированный вопрос, пожалуйста. – mfgabriel92

Смежные вопросы