django - использование того же маршрута в пути URL - PullRequest
0 голосов
/ 31 марта 2020

Я работал над проектом, и я новичок в 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>

Есть ли способ решить эту проблему? Пожалуйста, помогите!

1 Ответ

2 голосов
/ 31 марта 2020

Эти два следующих:

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'),

Пояснения :

FIRST: В ваших шаблонах, благодаря именам URL, Django будет генерировать URL с косыми чертами, как вы используется для raw HTML.

например: с {% url 'chgpassword' user.id %}, Django просматривает ваши шаблоны URL-адресов и находит следующие /update-password/<int:user_id>/ совпадения {% url 'chgpassword' user.id %}, заменяя user_id на id предоставляется в шаблоне.

THEN: Когда вы нажимаете ссылку HTML, Django ищет первый совпадающий URL-адрес для href='/update-password/ id_provided / '... и вызывает представление, связанное с ним ... Вот почему, как и вы, всегда вызывали одно и то же представление, в URL не было никаких различий, когда Django l oop через URL, первое совпадение всегда было первым найденным.

...