Django CreateForm - перенаправить на ту же форму в случае успеха - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть страница, которая содержит сообщение в блоге, с формой комментария над списком комментариев, чтобы пользователи могли добавлять комментарии. Сообщение в блоге имеет следующий URL (где blog_id является параметром URL):

/blog/<blog_id>

Шаблон URL:

urlpatterns = [
        path('post/<blog_id>', BlogPostView.as_view(), name="BlogPostView"),
]

Функция просмотра:

class BlogPostView(CreateView):
    template_name = 'blog_post.html'
    form_class = BlogCommentCreationForm
    success_url = ???

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['blog_post'] = CompanyBlogPost.objects.get(id=self.kwargs['blog_id'])
        return context

    def form_valid(self, form):
        form.instance.author = self.request.user
        form.instance.publish_datetime = dt.now()
        form.instance.blogpost = CompanyBlogPost.objects.get(id=self.kwargs['blog_id'])
        return super().form_valid(form)

Во-первых, это разумный способ реализации этого?

Во-вторых, все здесь работает, кроме success_url. Отправка формы должна создать комментарий и перенаправить на ту же страницу. Как мне определить success_url? Я хотел бы использовать:

success_url = reverse_lazy(BlogPostView, kwargs={'blog_id': self.kwargs['blog_id']})

Однако это терпит неудачу, поскольку BlogPostView используется в его собственном определении.

1 Ответ

0 голосов
/ 06 сентября 2018

Используйте URL name вместо представления, которое в соответствии с документами не рекомендуется:

Вы можете использовать любой из следующих способов для обратного URL:

с использованием названного URL

reverse('news-archive')

прохождение вызываемого объекта (Это не рекомендуется, потому что вы не можете обратное представление пространства имен таким образом.)

from news import views

reverse(views.archive)

и используйте метод get_success_url для передачи kwargs вместо success_url:

class BlogPostView(CreateView):
    # ...

    def get_success_url(self, **kwargs):
        return reverse_lazy('BlogPostView', kwargs={'blog_id': self.kwargs['blog_id'])
                             # ^ url name
...