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


UserPostListView.

Вот 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 the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation [Django-doc].

Вернуться на верх