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

Django报错Cannot resolve keyword 'slug' into field问题求助

Django Slug字段FieldError问题解决

错误根源分析

从报错信息可以明确看到:Django在查询Lesson模型时无法找到slug字段,因为Lesson模型中实际定义的字段是slugs(带后缀s),但代码中多处误写为slug,同时视图与URL的查询逻辑也存在不匹配问题。

问题点拆解

  1. 模型字段名与代码不统一:Lesson模型定义了slugs = models.SlugField(...),但save方法中却赋值给self.slug,导致字段实际未被正确赋值,且查询时找不到对应字段。
  2. DetailView默认查询字段不匹配:LessonDetailView作为DetailView,默认会用URL中的slug参数匹配模型的slug字段,但模型中实际是slugs,导致查询失败。
  3. URL参数与视图查询逻辑脱节:lesson_detail的URL包含standard、subject、slug三个参数,但默认的DetailView只会用slug查询,无法区分同slug不同科目/年级的课程。
  4. get_absolute_url方法参数错误:Lesson的get_absolute_url返回的是lesson_list路由,且参数与目标路由不匹配。

修复步骤

1. 统一Lesson模型的slug字段命名

将Lesson模型中的字段名修正为slug(与Standard、Subject模型保持一致),并修正save方法:

class Lesson(models.Model):
    lesson_id = models.CharField(max_length=250, unique=True)
    Standard = models.ForeignKey(Standard, on_delete=models.CASCADE)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE, related_name="lessons")
    name = models.CharField(max_length=250, unique=True)
    position = models.PositiveSmallIntegerField(verbose_name="Chapter no.")
    slug = models.SlugField(null=True, blank=True)  # 将slugs改为slug
    video = models.FileField(upload_to=save_lesson_files, verbose_name="Video", blank=True, null=True)
    ppt = models.FileField(upload_to=save_lesson_files, verbose_name="Presentations", blank=True)
    Notes = models.FileField(upload_to=save_lesson_files, verbose_name="Notes", blank=True)

    class Meta:
        ordering = ['position']

    def __str__(self):
        return self.name
    
    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)  # 赋值给正确的slug字段
        return super().save(*args, **kwargs)

2. 修正LessonDetailView的查询逻辑

让视图结合URL中的standard、subject、slug三个参数精确查询,避免同slug课程冲突:

class LessonDetailView(DetailView):
    context_object_name ='lessons'
    model = Lesson
    template_name = "curriculum/lesson_detail_view.html"

    def get_object(self):
        return Lesson.objects.get(
            Standard__slug=self.kwargs['standard'],
            subject__slug=self.kwargs['subject'],
            slug=self.kwargs['slug']
        )

3. 修正Lesson的get_absolute_url方法

让其返回正确的lesson_detail路由,并传递匹配的参数:

def get_absolute_url(self):
    return reverse('curriculum:lesson_detail', kwargs={
        'standard': self.Standard.slug,
        'subject': self.subject.slug,
        'slug': self.slug
    })

4. 执行数据库迁移

修改模型字段后,需要更新数据库:

python manage.py makemigrations
python manage.py migrate

5. 检查模板URL生成

确保模板中使用{% url %}标签生成URL时参数完整且正确,例如:

{% url 'curriculum:lesson_detail' standard=lesson.Standard.slug subject=lesson.subject.slug slug=lesson.slug %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:08:14