Представление модели 'User' на основе классов автоаутентифицирует пользователя

Я сделал представление на основе класса (DetailView) профиля пользователя приложения, и по какой-то причине любой, кто посещает это представление, автоматически считается аутентифицированным, даже без ввода учетных данных. Это происходит без добавления дополнительной логики ни в представление, ни в шаблон, просто базовый DetailView. Код приведен ниже:

views.py

from django.views.generic import DetailView
from django.contrib.auth.models import User

class ProfileDetail(DetailView):
    model = User
    template_name = 'index.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

urls.py

from django.urls import path
from .views import ProfileDetail

urlpatterns = [
    path('<int:pk>/', ProfileDetail.as_view())
]

шаблон (index.html)

{{ user.is_authenticated }} {# returns True #}
{{ user }} {# returns the user with the corresponding id #}

Вопрос в том, почему Django делает это и есть ли способ обойти это, кроме использования представления на основе функций? Я просмотрел документацию, но не смог найти ответа.

Для реализации аутентификации в Django Class-Based Views я использовал LoginRequiredMixin, как это объясняется здесь: https://docs.djangoproject.com/es/4.0/topics/auth/default/

Код (с сайта Django):

from django.contrib.auth.mixins import LoginRequiredMixin

class MyView(LoginRequiredMixin, View):
    login_url = '/login/'
    redirect_field_name = 'redirect_to'

Другой способ - передать представление, которое мы хотим аутентифицировать, в функцию login_required, в маппинге urls.py:

from django.contrib.auth.decorators import login_required
path('<int:pk>/', login_required(ProfileDetail.as_view())) #not tested

Самый простой способ сделать любую страницу login_required в представлениях на основе классов - использовать method_decoratordjango-doc

В вашем ProfileDetail вы можете реализовать следующим образом:

from django.contrib.auth.decorators import login_required

from django.utils.decorators import method_decorator

method_decorator(login_required(login_url="/any_login_route/"),name='dispatch')
class ProfileDetail(DetailView):
    ...
    ...

Это сделает страницу login_required, и установит login_url так, чтобы она могла перенаправлять на страницу входа, если пользователь не аутентифицирован, для более подробной информации вы можете посмотреть документацию, нажав на вышеупомянутый метод.

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