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

Django中URL参数传递失效问题求助

Django URL传递参数失败问题解决

问题背景

在Django项目中尝试通过URL传递user_id参数,但所有访问方式都返回404错误,相关代码及尝试操作如下:

views.py 代码

from django.shortcuts import render

def show_user_profile(request, user_id):
    assert isinstance(request, HttpRequest)
    return render(request, "app/show_user_profile.html", {'user_id': user_id})

初始urls.py 配置

urlpatterns = [
    path('', views.home, name='home'),
    path('profile/', views.profile, name='profile'),
    path(r'^show_user_profile/(?P<user_id>\w+)/$', views.show_user_profile, name="show_user_profile"),    
    path('admin/', admin.site.urls),
]

尝试过的访问URL

  • http://localhost:50572/show_user_profile/aaa
  • http://localhost:50572/show_user_profile/aaa/
  • http://localhost:50572/show_user_profile/aaa//
  • http://localhost:50572/show_user_profile/?user_id=aaa

尝试修改后的urls配置

  1. 整数参数版本:
path('show_user_profile/<int:user_id>/$', views.show_user_profile, name='show_user_profile')
  1. 无参数版本:
path(r'^show_user_profile/$', views.show_user_profile, name="show_user_profile"),

附show_user_profile模板代码

{% extends "app/layout.html" %}

{% block content %}

{% if request.session.uid %}

<div id="profile">
   <div>
        <span id="profile_prof_pic_content">
            <img id="prof_pic" src="{{ user_data.prof_pic }}" width="100" height="100" />
        </span>
        <span>
            {{ user_data.first_name }} {{ user_data.last_name }}
        </span>
    </div>
   <div>
       {{ user_data.prof_desc }}
   </div>
</div>
{% else %}
<h2>您尚未登录,<a href="/login/">点击登录</a>以访问该用户资料。</h2>
{% endif %}
{% endblock %}

{% block scripts %}

{% load static %}
<script src="{% static 'app/scripts/jquery.validate.min.js' %}"></script>

问题根源与解决方案

1. 核心错误:混用path()与正则语法

Django的path()函数不支持正则表达式(如^、$、(?P<user_id>\w+)这类语法),正则路由需要使用re_path()(或其别名url())。你初始的配置错误地在path()中使用正则,导致路由完全无法匹配。

2. 正确的路由配置

根据user_id的类型,选择以下两种配置之一:

场景1:传递字符串类型的user_id

方案A:使用re_path()+正则

from django.urls import path, re_path  # 务必导入re_path

urlpatterns = [
    path('', views.home, name='home'),
    path('profile/', views.profile, name='profile'),
    re_path(r'^show_user_profile/(?P<user_id>\w+)/$', views.show_user_profile, name="show_user_profile"),    
    path('admin/', admin.site.urls),
]

方案B:使用path()+字符串转换器
Django 2.0+支持路径转换器,无需正则即可匹配字符串:

path('show_user_profile/<str:user_id>/', views.show_user_profile, name='show_user_profile')

注意:path()会自动添加^和$边界符,无需手动添加。

场景2:传递整数类型的user_id

使用path()的int转换器更简洁高效:

path('show_user_profile/<int:user_id>/', views.show_user_profile, name='show_user_profile')

3. 额外注意事项

  • 视图导入缺失:views.py中未导入HttpRequest,需添加from django.http import HttpRequest,否则assert语句会触发报错。
  • 模板上下文不匹配:视图传递的是user_id,但模板中使用user_data变量,后续需在视图中查询用户数据并将user_data传入上下文。
  • URL访问格式:确保访问URL与路由配置一致,比如配置末尾带斜杠,则访问时也需带斜杠(如http://localhost:50572/show_user_profile/aaa/)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:10:43