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

Django中URL无法显示Slug替代图片ID的问题求助

问题排查与修复方案

以下是导致URL无法显示slug的核心错误及对应修复方法:


1. 模型层(models.py)字段引用错误

你的save方法里错误引用了不存在的self.title字段,实际模型定义的标题字段是image_title,这会导致slug无法正常生成。另外建议给slug字段添加唯一性约束,避免重复冲突。

修复后的代码:

from django.utils.text import slugify

class PostImage(models.Model):
    image = models.ImageField(null=False, blank=False, upload_to="images", default="default.png")
    image_title = models.CharField(max_length=100, null=False, blank=False, default="")
    slug = models.SlugField(null=True, unique=True)  # 增加唯一约束

    def save(self, *args, **kwargs):
        # 修正为正确的字段名image_title
        self.slug = self.slug or slugify(self.image_title)
        super().save(*args, **kwargs)
    
    def __str__(self):
        return self.image_title
    
    class Meta:
        verbose_name_plural = 'PostImages'  # 规范复数形式

2. 视图层(views.py)查询逻辑错误

viewImage函数里用id=slug查询对象完全不符合逻辑,传入的参数是slug,应该匹配模型的slug字段而非id。

修复后的代码:

def viewImage(request, slug):
    # 用slug字段匹配查询
    photo = PostImage.objects.get(slug=slug)
    return render(request, 'viewimage.html', {'photo': photo})

3. 模板层(图片选择页面HTML)链接参数错误

生成跳转链接时你传入的是photo.id,这会导致URL始终显示数字ID,必须替换为photo.slug才能生成带slug的URL。

修复后的链接代码:

<a href="{% url 'viewimage' photo.slug %}">
    <img class="gallery-thumbnail" src="{{photo.image.url}}" />
</a>

可选优化:强制slug非空

如果希望确保所有图片都有有效slug,可以修改模型字段并调整save逻辑:

slug = models.SlugField(null=False, blank=False, unique=True)

def save(self, *args, **kwargs):
    # 强制基于标题生成slug(若需保留手动设置的slug,可保留原or逻辑)
    self.slug = slugify(self.image_title)
    super().save(*args, **kwargs)

内容的提问来源于stack exchange,提问作者David Henson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:30:45