如何修复Wagtail中RoutablePage抛出的FieldError字段解析错误
错误原因分析
你遇到的报错由两个核心问题导致:
PostList的get_posts方法查询对象错误:你当前查询的是PostList类型的后代页面,但PostList本身没有分类、标签相关字段,自然无法识别category过滤字段- 跨表过滤的字段路径错误:
PostDetail和分类通过中间表关联,对应关联名为rncategory,你没有写完整的跨表查询路径
修复代码
你只需要修改PostList类下的三个方法即可:
class PostList(RoutablePageMixin, Page): # 其余原有代码保持不变 # 1. 修正get_posts方法,查询PostDetail类型的子页面 def get_posts(self): return PostDetail.objects.descendant_of(self).live().specific() # 2. 修正标签路由的过滤条件 @route(r'^tag/(?P<tag>[-\w]+)/$') def post_by_tag(self, request, tag, *args, **kwargs): self.search_type = 'tag' self.search_term = tag self.posts = self.get_posts().filter(tags__slug=tag) return Page.serve(self, request, *args, **kwargs) # 3. 修正分类路由的过滤条件,写完整跨表路径 @route(r'^category/(?P<category>[-\w]+)/$') def post_by_category(self, request, category, *args, **kwargs): self.search_type = 'category' self.search_term = category self.posts = self.get_posts().filter(rncategory__category__slug=category) return Page.serve(self, request, *args, **kwargs)
补充说明
- 新增的
.specific()方法可以确保你拿到的是PostDetail子类的实例,而非通用的Page基类实例,避免后续访问自定义字段时报错 - 跨表过滤的路径要和你定义的关联名完全对应:
PostDetail到中间表的关联名是rncategory,中间表到Category模型的字段名是category,所以完整路径就是rncategory__category__slug
内容的提问来源于stack exchange,提问作者Yan Tian
相关产品推荐
相关产品推荐

