如何在Django中创建双Model ID格式URL实现双用户类型权限控制?
问题修复方案
1. 视图函数名不匹配
URL配置中指定调用views.test_url,但视图函数定义的名称是function,二者不匹配导致Django无法找到对应视图。
修复后的views.py:
def test_url(request, user_id, project_id): user = User.objects.get(pk=user_id) project = Project.objects.get(pk=project_id) # 修正变量名:获取的是project而非projects,上下文键名统一为user和project return render(request, 'main/test_url.html',{'project': project, 'user': user})
2. URL路径缺少参数类型转换器
Django的path()需要明确参数的类型转换器(如int:),否则无法正确解析URL中的数值ID,导致路径匹配失败。
修复后的urls.py:
path('<int:user_id>/<int:project_id>/test_url', views.test_url, name="test-url"),
3. 视图上下文变量名错误
原视图中上下文字典写的{'project':projects, 'users':user}存在两处错误:projects是未定义变量(实际获取的是project),users与模板中使用的user变量名不统一,会导致模板渲染时找不到对应数据。
4. 模板变量有效性检查
确保使用链接的模板上下文里确实存在user和project对象,比如在用户详情页、项目列表页等场景,要保证模板能获取到这两个对象的ID值。
修复后的模板链接(变量名与上下文统一即可):
<a class="btn btn-outline-danger" href="{% url 'test-url' user.id project.id %}">See Test URL</a>
额外优化:添加异常处理
直接使用get()方法查询对象,若数据不存在会抛出DoesNotExist异常,建议改用get_object_or_404返回404页面,提升容错性:
from django.shortcuts import get_object_or_404 def test_url(request, user_id, project_id): user = get_object_or_404(User, pk=user_id) project = get_object_or_404(Project, pk=project_id) return render(request, 'main/test_url.html',{'project': project, 'user': user})
内容的提问来源于stack exchange,提问作者PhilM
相关产品推荐
相关产品推荐

