Представление модели '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 так, чтобы она могла перенаправлять на страницу входа, если пользователь не аутентифицирован, для более подробной информации вы можете посмотреть документацию, нажав на вышеупомянутый метод.