Представления на основе классов Django — ListView, если пользователь аутентифицирован, FormView, если пользователь не аутентифицирован, тот же URL

#django #django-class-based-views

#django #Представления на основе классов django

Вопрос:

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

Лучший способ добиться этого ListView — подклассировать оба FormView и переопределить каждый метод, необходимый для получения желаемого поведения? Или есть лучший способ? Проверка подлинности пользователя в каждом методе не похожа на способ Django сделать это. Надеюсь, для этого есть разумный подход к шаблону проектирования, о котором я не знаю.

 class HomepageView(ListView, FormView):

    def get_template_names(self):
        if self.request.user.is_authenticated:
            return ['homepage/loggedin_index.html']
        else:
            return ['homepage/loggedout_index.html']

    def get_context_data(self, **kwargs):
        if self.request.user.is_authenticated:
            ...
        else:
            ...

    def ... and so on
  

Мое обязательное требование заключается в том, что URL-адрес как для вошедших, так и для вышедших из системы пользователей должен соответствовать корневому URL-адресу, поскольку это домашняя страница.

 from django.urls import path
from .views import HomepageView

app_name = 'homepage'
urlpatterns = [
    path('', HomepageView.as_view(), name='index'),
]
  

Ответ №1:

Существует также CreateListView, который делает то, что вы хотите. И затем вы можете изменить его form на тот, который вы хотите.