Лучший способ передачи зарегистрированного пользователя бэкенду в Django

Я новичок в Django и я правильно создал страницу входа/регистрации и страницу моего аккаунта. Теперь моя проблема в том, что независимо от того, какой пользователь вошел в систему, когда он переходит на страницу моего аккаунта, URL также будет ./account

Есть ли способ передать, какой пользователь запрашивает страницу, и изменить URL в соответствии с этим, но всегда указывая на тот же шаблон?

Например, если пользователь вошел в систему с именем пользователя john, нажав на мой аккаунт, он перенаправляется на ./account/john, но показывает тот же шаблон. В основном я бы хотел, чтобы URL отражали пользователя, вошедшего в систему

В настоящее время я управляю страницей "Мой счет" следующим образом.

navbar.html

{% if user.is_authenticated %}
   <li class="">
      <a href="{% url 'account' %}">
         <i class='bx bxs-user-detail icon' ></i>
         <span class="text nav-text">My profile</span>
      </a>
   </li>

urls.py

from django.urls import path, include
from . import views

urlpatterns = [
    path('account', views.account_user, name="account"),
]

По сути, вам нужно 2 представления. Одно представление - account/, которое просматривает request.user и затем возвращает 302 для перенаправления пользователя на соответствующую страницу (например, Джон вошел в систему и перенаправляется на /account/john/). Другое представление - это отображение учетной записи, которое является account/<slug:username>/ и показывает информацию об учетной записи для вошедшего username.

Однако, вы также можете просто сделать так, чтобы ссылка в navbar.html указывала непосредственно на /account/john/, поскольку человек вошел в систему и у вас есть эта информация.

Вы можете сделать это, включив ключ для идентификации пользователя в структуру url. Это потребует изменений в трех местах: 1. navbar.html, 2. urls.py, 3. views.py. См. предложение для 1. и 2. ниже.

navbar.html

{% if user.is_authenticated %}
   <li class="">
      <a href="{% url 'account' user.user_name %}">
         <i class='bx bxs-user-detail icon' ></i>
         <span class="text nav-text">My profile</span>
      </a>
   </li>

urls.py

from django.urls import path, include
from . import views

urlpatterns = [
    path('account/<str:user_name>/', views.account_user, name="account"),
]

views.py

def your_view(request):
    context = {}
    ..
    # pass user object to context
    context['user'] = request.user
    # then pass context to the view

def account_user(request, user_name):
    # use user_name to update querysets or context

Однако, если я правильно понимаю, чего вы пытаетесь достичь (т.е. вы хотите персонализировать страницу 'account' для каждого пользователя), я бы подошел к этому по-другому, а именно, включив данные пользователя в представление 'account_user'. Вы можете сделать это, обратившись к объекту request.user. Таким образом, вам не придется переделывать структуру url (сэкономив на шагах, описанных выше).

views.py

def account_user(request):
    context = {}
    ..
    # pass user object to context
    context['user'] = request.user

    # filter any queries using the request.user object

    # then pass context to the view
Вернуться на верх