Django User View Affects current_user
У меня есть url для просмотра всей информации о конкретном пользователе:
blog/urls.py (я использую 'urlpatterns +=', чтобы передать часть списка urlpatterns, в моем файле это не +=)
urlpatterns += path('user/<int:pk>/', UserDetailView.as_view(), name='user-detail'),
который использует этот вид UserDetailView:
blog/views.py
class UserDetailView(DetailView):
model = User
template_name = 'blog/user_detail.html'
, который наследуется от DetailView и использует модель Django User.
У меня есть navbar в базовом html-файле, который отображает ник текущего пользователя с прикрепленной к нему ссылкой на его страницу:
base.html (от которого наследуют все остальные html-файлы)
{% if user.is_authenticated %}
<a class="nav-item nav-link" href="{% url 'post-create' %}">New Post</a>
<a class="nav-item nav-link" href="{% url 'user-detail' user.id %}">{{ user.username }}</a>
<a class="nav-item nav-link" href="{% url 'logout-page' %}">Logout</a>
Теперь, когда я залогинен и просматриваю любую страницу, кроме 'user/<int:pk>/'
, ник со ссылкой отображается как положено, но когда я просматриваю страницу какого-то конкретного пользователя, {{ user ]} меняется с текущего пользователя на пользователя, страницу которого я просматриваю: images.
ListView с моделью Post, которая вызывает пользователя по его нику, не влияет на текущего пользователя:
blog/urls.py
urlpatterns += path('user/<str:username>', UserPostListView.as_view(), name='user-posts')
blog/views.py
class UserPostListView(ListView):
model = Post
template_name = 'blog/user_posts.html' # <app>/<model>_<viewtype>.html # blog/post_list.html
context_object_name = 'posts'
paginate_by = 2
def get_queryset(self):
user = get_object_or_404(User, username=self.kwargs.get('username'))
return Post.objects.filter(author=user).order_by('-date_posted')
Вот git, если этого недостаточно для уточнения
Есть ли способ запретить DetailView с моделью User менять {{ user }} с текущего пользователя на того, чью страницу я просматриваю?
Есть ли способ предотвратить
DetailView
с моделью User от изменения {{ user }} с текущего пользователя на того, чью страницу я просматриваю?
Причина, по которой это происходит, заключается в том, что Django инжектирует объект как object
в шаблоне, но также как результат .get_context_object_name(…)
[Django-doc], который по умолчанию является именем модели в нижнем регистре, так что в этом случае user
Но мы можем получить пользователя, вошедшего в систему, как {{ request.user }}
вместо этого так:
{{ request.user }} # 🖘 logged-in user
{{ user }} # 🖘 object of the DetailView
{{ object }} # 🖘 object of the DetailView
Другой вариант - указать другое context_object_name
, например:
class UserDetailView(DetailView):
model = User
template_name = 'blog/user_detail.html'
context_object_name = 'the_user'
Таким образом, мы работаем с:
{{ request.user }} # 🖘 logged-in user
{{ user }} # 🖘 logged-in user
{{ the_user }} # 🖘 object of the DetailView
{{ object }} # 🖘 object of the DetailView
Note: It is normally better to make use of the
settings.AUTH_USER_MODEL
[Django-doc] to refer to the user model, than to use theUser
model [Django-doc] directly. For more information you can see the referencing theUser
model section of the documentation [Django-doc].