首页 > 解决方案 > Django CreateForm - 成功时重定向到相同的表单

问题描述

我有一个包含博客文章的页面,在评论列表上方有一个评论表单,以允许用户添加评论。博客文章具有以下 url(其中blog_id是 url 参数):

/blog/<blog_id>

网址模式:

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 在其自己的定义中使用。

标签: djangodjango-formsdjango-views

解决方案


使用 urlname而不是视图,根据文档,这是不鼓励的:

您可以使用以下任何方法来反转 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

推荐阅读