Django中将主题查询函数视图转为DetailView类视图的问题求解
问题原因&修复方案
1. 报错问题解决
你遇到的字段找不到报错,是因为get_queryset方法里的过滤条件写错了:你当前查询的是Topic模型本身,该模型自带slug字段,不需要写topic__slug跨表关联语法。
而且你已经配置了slug_url_kwarg = 'topic_slug',Django的DetailView默认会自动用这个URL参数匹配slug字段查询对应对象,不需要你手动写slug过滤逻辑。
如果你要实现原来的主题归属校验,直接在get_queryset里加owner过滤即可,比单独调用校验方法更安全,访问不属于自己的主题时会直接返回404。
2. 添加上下文entries
要把关联的entries传入模板,重写get_context_data方法,在默认上下文的基础上追加entries数据即可。
完整可用代码
# 后续加LoginRequiredMixin直接放在继承的第一个位置即可 class ShowTopic(DetailView): model = Topic template_name = 'learning_logs/topic.html' context_object_name = 'topic' slug_url_kwarg = 'topic_slug' def get_queryset(self): # 过滤当前用户的主题,替代原有的check_topic_owner逻辑 return super().get_queryset().filter(owner=self.request.user) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 追加按时间倒序的关联条目,和原有函数视图逻辑完全一致 context['entries'] = self.object.entry_set.order_by('-date_added') return context
注:如果暂时不想加归属过滤,直接删掉
get_queryset方法即可,DetailView会自动完成slug匹配查询。
内容的提问来源于stack exchange,提问作者Алексей sk1p
相关产品推荐
相关产品推荐

