Django: перенаправить на текущую статью после комментария - PullRequest
5 голосов
/ 23 января 2010

Я пытаюсь использовать приложение комментариев в моем проекте.

Я пытался использовать код ({% render_comment_form для события%}), показанный в документации здесь: комментарии Django

И вопрос в том, как сделать так, чтобы форма перенаправлялась на ту же страницу после отправки.


Также большой вопрос: В настоящее время, если в for найдена какая-либо ошибка, мы перенаправляемся на предварительный просмотр шаблона. Можно ли избежать такого поведения и отобразить ошибки в одной и той же форме (на одной странице)?

Ответы [ 5 ]

5 голосов
/ 30 января 2010

Я покажу вам, как я решил это в моем блоге, чтобы вы могли сделать что-то подобное. Мои комментарии для модели Entry в приложении для записей.

Сначала добавьте новый метод для вашего объекта Entry (like).

def get_absolute_url(self):
    return "/%i/%i/%i/entry/%i/%s/" % (self.date.year, self.date.month, self.date.day, self.id, self.slug)

Генерирует URL для объектов ввода. Пример URL: / 2009/12/12 / entry / 1 / lorem-ipsum /

В urls.py добавить 1 строку:

(r'^comments/posted/$', 'smenteks_blog.entries.views.comment_posted'),

Так что теперь у вас должно быть как минимум 2 строки для комментариев в файле urls.py.

(r'^comments/posted/$', 'smenteks_blog.entries.views.comment_posted'),
(r'^comments/', include('django.contrib.comments.urls')),

Для записей (например) приложения в файле views.py добавить функцию:

from django.contrib.comments import Comment #A
...
def comment_posted(request):
    if request.GET['c']:
        comment_id = request.GET['c'] #B
        comment = Comment.objects.get( pk=comment_id )
        entry = Entry.objects.get(id=comment.object_pk) #C
        if entry:
            return HttpResponseRedirect( entry.get_absolute_url() ) #D
    return HttpResponseRedirect( "/" )    
  • A) Импортировать поверх файла доступ к объекту комментария,
  • Б) Получить Форма комментария REQUEST,
  • C) Fetch входной объект,
  • D) Использование метод get_absolute_url, чтобы сделать правильный редирект.

Сейчас:

  • Кнопка «Отправить» в форме комментария на сайте входа перенаправляет пользователя на тот же (входной) сайт.
  • Кнопка «Опубликовать» на сайте предварительного просмотра перенаправляет пользователя на соответствующий (входной) сайт.
  • Кнопка предварительного просмотра в форме комментариев на сайте входа и на сайте предварительного просмотра перенаправляет пользователя на сайт предварительного просмотра
  • Спасибо, страница больше не используется (по моему мнению, эта страница была довольно раздражающей).

Следующее, что нужно сделать, это переопределить шаблон preview.html:

  • Перейдите в django framework dir, под linux это можно сделать с помощью / usr / share / pyshared /.
  • Получить оригинальный шаблон preview.html от DJANGO_DIR / contrib / comments / templates / comments / preview.html
  • Скопируйте его в директорию шаблонов в вашем проекте PROJECT_DIR / templates / comments / records_preview.html
  • Отныне он будет переопределять шаблон по умолчанию. Вы можете изменить extends следующим образом: {% extends "your_pagelayout.html"%}, чтобы ваш макет и все файлы css работали.
1 голос
/ 18 июня 2012

Посмотрите на папку "Django-1.4 / django / contrib / comments / templates / comments /", и вы увидите в файле "form.html", там есть строка

{% if next %}<div><input type="hidden" name="next" value="{{ next }}" /></div>{% endif %}

Следовательно, в представлении Article-Detail вы можете включить атрибут «next» в данные контекста, а затем инфраструктура комментариев сделает все остальное

class ArticleDetailView(DetailView):
    model = Article
    context_object_name = 'article'

    def get_context_data(self, **kwargs):
        context = super(ArticleDetailView, self).get_context_data(**kwargs)

        context['next'] = reverse('blogs.views.article_detail_view', 
            kwargs={'pk':self.kwargs['pk'], 'slug': self.kwargs['slug']})
        return context
1 голос
/ 14 марта 2011

Обновление: теперь есть возможность перенаправить как часть формы комментария: см. http://docs.djangoproject.com/en/dev/ref/contrib/comments/#redirecting-after-the-comment-post

1 голос
/ 23 января 2010
0 голосов
/ 13 июня 2014

Это действительно простое перенаправление для реализации. Он перенаправляет вас обратно на страницу, где был сделан комментарий.

Когда комментарий публикуется, URL-адрес комментирует / отправляет / вызывает представление comment_posted, которое затем перенаправляется обратно на страницу реферера.

Обязательно замените [app_name] именем вашего приложения.

views.py

from urlparse import urlsplit

def comment_posted( request ):
    referer = request.META.get('HTTP_REFERER', None)
    if referer is None:
        pass
    try:
        redirect_to = urlsplit(referer, 'http', False)[2]
    except IndexError:
       pass
    return HttpResponseRedirect(redirect_to)

urls.py

( r'^comments/posted/$', '[app_name].views.comment_posted' ),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...