django-在 url 路径中使用相同的路由

django-using same route in url path

我正在做一个项目,我是 Django 的初学者。我将 user.id 从模板传递到 URL 用于两件事,即一件用于配置文件更新,一件用于密码重置。但无论我是点击个人资料更新还是密码重置,它都只会出现一个 URL。我认为问题是我不能在两个 URL 路径中使用相同的路由。 这是我的 url.py:

urlpatterns = [
path('signup', views.signup, name='signup'),
path('login', views.login, name='login'),
path('logout', views.logout, name='logout'),
path('<int:user_id>/', views.chgprofile, name='chgprofile'),
path('<int:user_id>/', views.chgpassword, name='chgpassword'),
]

这是我的模板代码,其中显示了两个按钮:

<a class="btn btn-sm btn-outline-primary" href="{% url 'chgpassword' user.id %}">change password</a>
<a class="btn btn-sm btn-outline-primary" href="{% url 'chgprofile' user.id %}">update profile</a>

有什么办法可以解决吗?请帮忙!

下面这两个:

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

实际上有相同的模式,Django 总是匹配第一个找到的 domain/ id between [0-9]

所以要解决这个问题,请更改 URL 的模式,使它们与众不同;

path('update-profile/<int:user_id>/', views.chgprofile, name='chgprofile'),
path('update-password/<int:user_id>/', views.chgpassword, name='chgpassword'),

解释:

首先:在您的模板中,由于 URL 名称,Django 将生成带有斜杠的 url,就像您以前使用原始 HTML.

所做的那样

例如:对于 {% url 'chgpassword' user.id %},Django 会查看您的 urls 模式,并通过将 user_id 替换为以下 /update-password/<int:user_id>/ 匹配 {% url 'chgpassword' user.id %}模板中提供的 ID。

THEN: 当你点击 HTML link 时,Django 会寻找第一个匹配项 URL 到 href='/update-password/ id_provided /'... 并调用关联的视图有了它......这就是为什么像你一样,总是调用相同的视图,在 urls 中没有不同,当 Django 循环遍历 URLs 时,第一个匹配项总是第一个找到的。