Как вернуть TemplateView.as_view(), если пользователь аутентифицирован?

# urls.py
from django.contrib import admin
from django.urls import path, include
from home import views
from django.views.generic import TemplateView


urlpatterns = [ 
    path('',views.index, name="home"),
    path('', TemplateView.as_view(template_name='index.html')),
    path('login',views.loginUser, name="login"),
    path('logout',views.logoutUser, name="logout"),
]

Выше приведен мой файл urls.py.

# views.py
from django.views.generic import TemplateView

def index(request):
    print(request.user)
    if request.user.is_anonymous:
        return redirect("/login") 
    return render(request, TemplateView.as_view(template_name="about.html"))
.
.
.

Выше приведена часть моего файла views.py

Я пытаюсь вернуть/отдать файл "index.html" как TemplateView.as_view() (поскольку я использую React на фронтенде) ТОЛЬКО если пользователь аутентифицирован. С частью аутентификации я разобрался, мне нужна помощь, чтобы понять, как написать код для возврата/воспроизведения файла index.html как TemplateView.as_view().

Спасибо.

Если вы хотите отобразить шаблон с помощью TemplateView, вы должны использовать представление , основанное на классах. Вы используете представление на основе функций, поэтому можете отобразить шаблон как:

def index(request):
    if request.user.is_anonymous:
       return redirect("/login") 
    return render(request, "about.html")

Для представления на основе классов вы можете ознакомиться с официальной документацией Django здесь

Вот пример того, как это можно сделать. Я бы посоветовал вам использовать CBV и использовать LoginRequiredMixin.

from django.views.generic import TemplateView
from django.contrib.auth.mixins import LoginRequiredMixin


class Something(LoginRequiredMixin, TemplateView)
    login_url = '/login/'
    redirect_field_name = 'login'
    template_name = "about.html"

Bookmark Classy Class-based Views

Вы хотите проверить, что пользователь аутентифицирован, прежде чем показать ему страницу. Есть два способа. Один - подкласс соответствующего метода в представлении. get, probably.

def get (self, request, *args, **kwargs):
    if request.user.is_anonymous:
        return redirect("/login") 
    return super().get( request, *args, **kwargs)

Другой вариант - использовать один из миксинов, предоставляемых фреймворком Django, в данном случае LoginRequiredMixin согласно ответу Рамиля

Второе лучше всего подходит, если LoginRequiredMixin делает то, что вы хотите. Подкласс get (или dispatch, или setup) подходит, если поставляемый миксин не делает того, что вы хотите, поэтому вы вводите свой собственный код.

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