Django CreateForm-成功重定向到相同的表单

时间:2018-09-05 20:30:09

标签: django django-forms django-views

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

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

1 个答案:

答案 0 :(得分:0)

不建议使用网址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