You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 00:27:39