Django:修复Actor匹配查询不存在错误并替换地址栏slug
问题修复:Django中Actor详情页“查询不到匹配项”错误及地址栏显示修正
错误原因
你当前的问题根源是模板标签里传递了电影的slug(mov.slug)给演员详情页的URL,但视图函数是用这个slug去查询Actor表,而电影slug和演员slug不匹配,自然找不到对应记录(地址栏显示的the-godfather是电影slug,并非演员的slug)。
修复步骤
1. 修正模板中的URL调用逻辑
将模板里的{% url 'Crew:view_actor' mov.slug %}替换为传递演员对象的slug:
- 如果模板中遍历的是演员列表(比如变量名为
actor),写法如下:{% url 'Crew:view_actor' actor.slug %} - 如果是从电影关联到演员(假设Movie和Actor是多对多/外键关联),要确保拿到的是演员实例的slug,示例:
{% url 'Crew:view_actor' movie.actors.first.slug %}
2. 优化视图的异常处理(推荐)
原视图用get()方法查询,找不到记录会直接抛出异常,改用get_object_or_404返回友好的404页面:
from django.shortcuts import render, get_object_or_404 from Crew.models import Actor def view_actor(request, aslug): actor = get_object_or_404(Actor, slug=aslug) return render(request, 'crew_detail.html', {'context': actor})
3. 确保Actor的slug自动生成(补充优化)
你的Parent模型中slug的默认值设为name,但不会自动生成slug,重写save方法自动基于name生成slug,避免手动错误:
from django.db import models from django.utils.text import slugify class Parent(models.Model): name = models.CharField(max_length=30, unique=True) slug = models.SlugField(max_length=50, unique=True) designation = models.CharField(max_length=30, blank=True) about = models.TextField(max_length=2000, blank=True, null=True) class Meta: abstract = True def __str__(self): return self.name def save(self, *args, **kwargs): # 仅当slug为空时,基于name生成slug if not self.slug: self.slug = slugify(self.name) super().save(*args, **kwargs) class Actor(Parent): photo = models.ImageField(upload_to='crew/actor', blank=True, null=True)
修复后效果
修正完成后,模板生成的URL会自动带上演员的slug(比如al-pacino),地址栏显示内容正确,视图能正常匹配到对应的Actor记录,不会再出现“Actor matching query does not exist”错误。
内容的提问来源于stack exchange,提问作者Miguel O'Hara
相关产品推荐
相关产品推荐

