【问题标题】:django-using same route in url pathdjango-在 url 路径中使用相同的路由
【发布时间】:2020-07-12 08:40:46
【问题描述】:

我正在做一个项目,我是 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>

有没有办法解决这个问题?请帮忙!

【问题讨论】:

    标签: django python-3.x django-templates django-urls


    【解决方案1】:

    以下两个:

    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 会查看您的 url 模式,并通过将 user_id 替换为模板中提供的 id 来找到以下 /update-password/&lt;int:user_id&gt;/ 匹配 {% url 'chgpassword' user.id %}

    然后:当您单击 HTML 链接时,Django 将查找第一个匹配 URL 到 href='/update-password/ id_provided /'... 并调用与之关联的视图... 这就是为什么像您一样,总是调用相同的视图,urls没有什么不同,当Django循环urls时,第一个匹配总是第一个找到的。

    【讨论】:

    • 好的,谢谢您的帮助。但是我是否还需要在模板中专门更改任何内容?
    • 不是真的,Django 将通过 URL 名称完成剩下的工作
    • 效果非常好。非常感谢您的帮助:)
    猜你喜欢
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2012-07-09
    • 1970-01-01
    • 2017-11-10
    • 2021-09-12
    相关资源
    最近更新 更多