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

Django项目Director详情页跳转失败及信息显示异常问题求助

问题解决方案

一、解决NoReverseMatch错误

错误提示Reverse for 'view_director' with arguments '('',)' not found,核心原因是传递的slug参数为空,需从以下两点修复:

1. 自动生成Director的slug

修改crew/models.py,添加自动生成slug的逻辑,确保每个Director实例都有非空唯一的slug:

from django.db import models
from django.utils.text import slugify

class Director(models.Model):
    name = models.CharField(max_length=30, blank=True, null=True)
    photo = models.ImageField(upload_to='crew/director')
    slug = models.SlugField(max_length=50, unique=True, blank=True)
    about = models.TextField(max_length=2000, blank=True)

    def __str__(self):
        return self.name or "Unnamed Director"

    def save(self, *args, **kwargs):
        # 若slug为空且存在name,自动生成slug
        if not self.slug and self.name:
            self.slug = slugify(self.name)
            # 处理重复slug的情况
            counter = 1
            while Director.objects.filter(slug=self.slug).exists():
                self.slug = f"{slugify(self.name)}-{counter}"
                counter += 1
        super().save(*args, **kwargs)

2. 修正模板变量引用

电影详情页上下文变量是mov,跳转链接需用mov.director.slug而非director.slug,同时添加空值判断:

{% if mov.director %}
<a href="{% url 'crew:view_director' mov.director.slug %}"> 
    <img src="{{ mov.director.photo.url }}" class="card-img-top rounded-0" alt="{{ mov.director.name }}"> 
</a>
{% else %}
<div class="card-img-top rounded-0 bg-light d-flex align-items-center justify-content-center">
    <span>No Director</span>
</div>
{% endif %}

二、解决导演信息不显示问题

1. 确保Movie模型正确关联Director

检查movie/models.py,确认外键关联配置正确:

from django.db import models
from crew.models import Director

class Movie(models.Model):
    # 其他电影字段...
    director = models.ForeignKey(Director, on_delete=models.SET_NULL, null=True, blank=True, related_name='movies')

2. 模板中添加空值与异常处理

避免因导演为空或图片缺失导致的显示异常:

<div class="card rounded-0" style="width: 14rem;">
  {% if mov.director %}
  <a href="{% url 'crew:view_director' mov.director.slug %}">
   <img src="{{ mov.director.photo.url|default:'/static/default-director.jpg' }}" class="card-img-top rounded-0" alt="{{ mov.director.name|default:'Unknown Director' }}">
  </a>
    <div class="card-body">
      <h5 class="card-title">{{ mov.director.name|default:'Unknown Director' }}</h5>
      <p class="card-text">Director</p>
    </div>
  {% else %}
    <div class="card-body text-center">
      <h5 class="card-title">Unknown Director</h5>
      <p class="card-text">Director</p>
    </div>
  {% endif %}
</div>

3. 配置媒体文件路由

确保项目settings.py中正确配置媒体文件:

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

并在项目主urls.py中添加媒体文件路由:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # 其他路由...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

三、视图优化:处理无效slug

修改crew/views.py,用get_object_or_404替代get,避免无效slug导致的服务器错误:

from django.shortcuts import render, get_object_or_404
from crew.models import Director

def view_director(request, dslug):
    director = get_object_or_404(Director, slug=dslug)
    return render(request, 'director_detail.html', {'director': director})

内容的提问来源于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 20:09:56