Django动态ListView筛选问题:点击图片跳转分类页面报错
这个错误的核心是模板生成URL时传入了空值,结合你的代码,从以下几个方向逐一排查修复:
1. 模板跳转URL的变量错误
你的IndexView模板里,{% url "main:select" slug %}中的slug变量根本不存在于当前上下文里,应该使用当前图片对应的分类slug,也就是image.categories.slug。另外要注意categories字段允许为null,必须加判断避免空值报错:
{% for image in main_images %} <div class="cbp-item web-design print"> {% if image.categories %} <a href="{% url "main:select" image.categories.slug %}" class="cbp-caption cbp-singlePageInline"> <div class="cbp-caption-defaultWrap"> <img src="{{ MEDIA_URL }}{{ image.image.url }}" alt=""> </div> </a> {% else %} <!-- 无分类的图片可添加默认处理,比如不显示跳转链接 --> <div class="cbp-caption-defaultWrap"> <img src="{{ MEDIA_URL }}{{ image.image.url }}" alt=""> </div> {% endif %} </div> {% endfor %}
另外注意{{ MEDIA_URL }} {{ image.image.url }}里的空格要去掉,否则图片URL会包含空格导致加载失败。
2. SelectView视图的逻辑错误
你的SelectView存在两处关键逻辑错误:
get_queryset里用title=self.kwargs['slug']查找Category完全错误,URL传入的是slug参数,应该用slug=self.kwargs['slug']匹配- 过滤Media时,
categories__title=self.category是把Category对象和title字段做对比,逻辑混乱,直接用外键对象过滤即可 get_context_data里把Category对象赋值给slug,应该传入字符串类型的slug值
修正后的SelectView:
class SelectView(ListView): template_name = "main/select.html" model = Media def get_queryset(self): # 通过slug查找分类,而非title self.category = get_object_or_404(Category, slug=self.kwargs['slug']) # 直接用分类对象过滤关联的Media,同时保留可见性筛选 return Media.objects.filter(categories=self.category, visable=True) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 传入分类的slug字符串,而非对象 context['slug'] = self.category.slug # 可顺便传入分类对象,方便在模板显示分类标题 context['category'] = self.category return context
3. 模型的优化建议(可选但推荐)
- 外键字段命名
categories不合适,因为一个Media只关联一个Category,复数命名容易让人误解为多对多关系,建议改成category,修改后需同步更新视图和模板中的字段名 - Category模型里的
slug = AutoSlugField(populate_from='title')末尾多了一个反引号,属于语法错误,必须删除
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

