Django通过URL按分类筛选服务出现Page not found (404)错误
问题根因
你页面跳转后出现/services/None报错的核心原因是Category模型的slug字段允许为空,你已入库的分类数据没有填充slug值,调用get_absolute_url方法时就会把None作为参数传入路由,自然匹配不到对应的分类,触发404。
第一步:修正Category模型的slug字段配置
首先要保证每个分类都有唯一的slug值,我们可以通过重写save方法自动根据分类名称生成slug,无需手动填写,修改home_app/models.py代码如下:
from django.db import models from django.urls import reverse from django.utils.text import slugify # 导入自动生成slug的工具 class Category(models.Model): name=models.CharField(primary_key=True, max_length=50) # 去掉null=True,blank=True保留后台手动修改的能力 slug=models.SlugField(unique=True, blank=True) image=models.ImageField(upload_to='category_home') description=models.CharField(max_length=100) content=models.TextField(max_length=500, default="Service") created=models.DateTimeField(auto_now_add=True) class Meta: verbose_name = 'Category' verbose_name_plural = 'Categories' def __str__(self): return self.name # 重写save方法,自动生成slug def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.name) super().save(*args, **kwargs) def get_absolute_url(self): return reverse('services_by_category', args=[self.slug])
第二步:执行数据库迁移,补全已有分类的slug
修改模型后执行迁移命令:
python manage.py makemigrations python manage.py migrate
如果迁移时提示已有数据slug为空的错误,可先进入Django shell手动补全存量数据:
python manage.py shell
在shell交互界面执行以下代码:
from home_app.models import Category from django.utils.text import slugify for cate in Category.objects.all(): if not cate.slug: cate.slug = slugify(cate.name) cate.save()
第三步:修正路由匹配规则(可选,规避额外404)
Django默认会对不带末尾斜杠的请求做301跳转,建议给子路由加上末尾斜杠避免匹配异常,修改services_app/urls.py:
from django.urls import path from services_app import views urlpatterns = [ path('', views.service_list, name='Services'), path('<slug:category_slug>/', views.service_list, name='services_by_category'), # 新增末尾斜杠 ]
所有修改完成后重启服务,点击分类链接就会生成正常的路径,成功匹配对应分类的服务列表。
内容的提问来源于stack exchange,提问作者Shifter
相关产品推荐
相关产品推荐

