我有一个页面,其中包含一个博客文章,在评论列表上方有一个评论表单,允许用户添加评论。
博客文章具有以下网址(其中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在其自己的定义中使用。
答案 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