Wagtail博客多作者关联实现404报错及自动完成选择器咨询
报错修复方案
你遇到的404错误是因为SnippetChooserPanel仅适用于已注册为Snippet的模型,自定义用户模型无需注册为Snippet,直接使用Wagtail原生提供的UserChooserPanel即可解决问题。
修改PostAuthorsOrderable模型的面板配置:
# Wagtail 3.0+ 导入路径如下,旧版本可从wagtail.core.panels导入 from wagtail.admin.panels import UserChooserPanel class PostAuthorsOrderable(Orderable): page = ParentalKey("blog.BlogPost", related_name="post_authors") author = models.ForeignKey("users.User",on_delete=models.CASCADE) panels = [ UserChooserPanel("author"), ]
修改后重启服务即可正常打开作者选择弹窗。
自动补全多选控件实现
如果你不需要自定义调整作者的展示顺序,可以直接简化实现,无需使用Orderable中间表,直接在BlogPost模型上声明多对多字段,搭配AutocompletePanel即可实现多选自动补全效果:
from wagtail.admin.panels import AutocompletePanel class BlogPost(Page): # 原有字段省略 authors = models.ManyToManyField( "users.User", related_name="authored_blog_posts", blank=True ) content_panels = Page.content_panels + [ MultiFieldPanel( [ AutocompletePanel( "authors", target_model="users.User", min_num=1, max_num=4 ) ], heading="Authors (don't forget to add yourself!)" ), # 其余面板配置省略 ]
如果需要保留作者排序功能,也可以在现有Orderable结构基础上,给author字段配置自动补全widget,同样能实现输入时实时检索匹配的效果。
关联作者编辑权限配置
要让所有关联到文章的作者自动拥有该文章的编辑权限,重写BlogPost模型的permissions_for_user方法即可:
class BlogPost(Page): # 原有字段和配置省略 def permissions_for_user(self, user): # 继承原有权限逻辑 perms = super().permissions_for_user(user) # 校验用户是否为当前文章的关联作者 is_author = self.post_authors.filter(author=user).exists() if is_author: # 可根据实际需求调整授予的权限,可选值包括change、publish、delete、lock、unlock等 perms.add_permission("change") perms.add_permission("publish") return perms
内容的提问来源于stack exchange,提问作者timovdw
相关产品推荐
相关产品推荐

