Django DetailVew пользователя влияет на аутентифицированного пользователя - PullRequest
0 голосов
/ 26 января 2019

Я пытался отобразить информацию о пользователе (странице профиля) с помощью DetailView.Это работает, но когда я по какой-то причине открываю DetailView пользователя, Django думает, что я аутентифицирован как этот пользователь.Например, если я выйду из системы, откройте какой-нибудь пользователь DetailView, Django начинает думать, что я вошел в систему как этот пользователь.Я вижу проблемы, так как base.html показывает текущего зарегистрированного пользователя и изменения, если пользователь не аутентифицирован.Есть идеи, что не так?Спасибо!

views.py

class ProfileView(DetailView):
    model = User
    template_name = 'users/profile.html'

urls.py

urlpatterns = [
    path('profile/<int:pk>/<str:username>', ProfileView.as_view(), name='profile'),
]

profile.html

{% extends 'base.html' %}
{% block content %}
    <article class = 'media content-section'>
    <div class="media">
        <img class="avatar-image rounded-circle" src="{{ user.profile.image.url }}">
        </div>
    <div class = 'media-body'>
        <div class='article-metadata'>
            <h3>Профиль {{user.username}}</h3>
        </div>
        <div class="article-content">
            <p>{{user.first_name}}</p>
            <p>{{user.email}}</p>
            <p>{{user.profile.birthdate}}</p>
            <p>{{user.date_joined}}</p>
        </div>
    </div>
    </article>
{% endblock %}

base.html

<div class="navbar-nav">
    {% if user.is_authenticated %}
    <div class="nav-item dropdown">
    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
    <i class="far fa-user-circle" title="Пользователь"> {{user.username}}</i></a>
...

1 Ответ

0 голосов
/ 26 января 2019

На самом деле, пользователь не вошел в систему, но проблема с вашим кодом. Когда вы отправляете данные User в шаблон с параметром контекста user, они смешиваются с request.user. И что интересно, если вы попробуете с этим пользователем (который отправлен из DetailView), он покажет is_authenticated true, так что вы увидите вошедшего в систему пользователя на основе html. Например:

user = User.objects.first()
user.is_authenticated()  # It will return True

Чтобы предотвратить это, вам нужно отправить другой параметр контекста для DetailView. Как:

class ProfileView(DetailView):
    context_object_name = "profile_user"
    ...

и в шаблоне используйте profile_user. Кроме того, если вы хотите, чтобы только зарегистрированный пользователь имел доступ к этому конкретному представлению, вы должны создать его подкласс из LoginRequiredMixin . Например:

from django.contrib.auth.mixins import LoginRequiredMixin

class ProfileView(LoginRequiredMixin, DetailView):
   ...
...