Эти два следующих:
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, первое совпадение всегда было первым найденным.