Лучший способ передачи зарегистрированного пользователя бэкенду в 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