django - 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 在其自己的定义中使用。
解决方案
使用 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
推荐阅读
- amazon-dynamodb - DynamoDB 仅索引一组特定的值
- ios - UITableViewCell 显示不正确的字符串
- perl - 当 LWP::UserAgent 连接到代理时,是否可以添加一些调试输出?
- python - 读取格式化 LaTeX 块中导出的值数组?
- visual-studio-code - WSL环境中的VSCode任务,尝试运行shell脚本时终端一直退出
- elixir - 如何 unix 将一个命令的输出通过管道传输到 Elixir 的混合任务中?
- python - 美丽的汤 find_all() 方法抓取的标签比过滤器指定的要多
- android - 如果主活动中有 Fragment,则在哪里更新 UI 元素
- javascript - 使用 Google Apps 脚本填写保存在我的 Google Drive 上的 PDF 表单
- laravel - Laravel Nova 自定义字段获取模型值