Django2与Python3下URL模式pk参数匹配错误求助
嘿,我看了你用Python 3 + Django 2实现动态URL的代码,发现几个容易踩的小坑,这就帮你修正并解释清楚~
问题分析与修正步骤
你的代码思路是对的,但存在几处细节问题会导致功能失效,具体如下:
- URL路径的参数名与视图函数的接收参数名不匹配
- 模型字段拼写不完整且缺少必填参数
- 视图内变量名与模型类名存在混淆风险
修正后的完整代码示例
1. urls.py(统一参数名)
# 把路径参数名改为和视图接收参数一致的`pk` path('categories/<int:pk>/', views.item_category, name="item_category"),
或者如果你想保留参数名item_category,需要同步修改视图函数的参数名:
# urls.py保持原代码的话,views.py要对应调整 def item_category(request, item_category): current_category = get_object_or_404(Categories, pk=item_category) return render(request, 'items_modal.html', {'item_category': current_category})
2. views.py(修正参数匹配+优化变量名)
from django.shortcuts import get_object_or_404, render from .models import Categories def item_category(request, pk): # 避免变量名和模型类名混淆,改用`current_category` current_category = get_object_or_404(Categories, pk=pk) return render(request, 'items_modal.html', {'item_category': current_category})
3. models.py(补全字段定义)
from django.db import models class Categories(models.Model): # CharField必须指定max_length参数,补全拼写并添加参数 category_name = models.CharField(max_length=255) # 建议添加__str__方法,在后台管理和调试时更直观 def __str__(self): return self.category_name
关键说明
- 参数名一致性:Django会严格按照URL路径里的参数名,把值传递给视图函数对应的参数,两者必须完全匹配,否则会抛出参数不匹配的错误。
- CharField必填参数:
max_length是CharField的强制参数,用于指定数据库字段的最大长度,不设置会直接导致模型迁移失败。 - 变量名可读性:视图内的变量名尽量避免和模型类名重复,减少代码阅读和调试时的混淆。
内容的提问来源于stack exchange,提问作者Ahmed Wagdi
相关产品推荐
相关产品推荐

