Django报错Cannot resolve keyword 'slug' into field问题求助
Django Slug字段FieldError问题解决
错误根源分析
从报错信息可以明确看到:Django在查询Lesson模型时无法找到slug字段,因为Lesson模型中实际定义的字段是slugs(带后缀s),但代码中多处误写为slug,同时视图与URL的查询逻辑也存在不匹配问题。
问题点拆解
- 模型字段名与代码不统一:
Lesson模型定义了slugs = models.SlugField(...),但save方法中却赋值给self.slug,导致字段实际未被正确赋值,且查询时找不到对应字段。 - DetailView默认查询字段不匹配:
LessonDetailView作为DetailView,默认会用URL中的slug参数匹配模型的slug字段,但模型中实际是slugs,导致查询失败。 - URL参数与视图查询逻辑脱节:
lesson_detail的URL包含standard、subject、slug三个参数,但默认的DetailView只会用slug查询,无法区分同slug不同科目/年级的课程。 - 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
相关产品推荐
相关产品推荐

