Как добавить условия шаблона в классе ListView? - PullRequest
1 голос
/ 26 мая 2019

У меня есть класс ListView в views.py, я хочу добавить условие, если аутентифицированный пользователь отображает другой шаблон

urls.py

from django.urls import path, include
from django.contrib.auth import views as auth_views
from .views import (
    PostListView,
)

urlpatterns = [
    path('', PostListView.as_view(), name='index'),
]

Views.py

from django.shortcuts import render, get_object_or_404
from django.views.generic import (
    ListView,
)
from .models import Post
from django.contrib.auth.models import User
from django.contrib.auth import authenticate


class PostListView(ListView):
    model = Post
    template_name = 'page/index.html'
    context_object_name = 'posts'
    ordering = ['-date_posted']
    paginate_by = 7

я хочу добавить

        if self.request.user.is_authenticated:
            template_name = 'page/index.html'
        else:
            template_name = 'page/home.html'

Django 2.2.x

1 Ответ

1 голос
/ 26 мая 2019

Вы можете переопределить функцию get_template_names [Django-doc] :

class PostListView(ListView):
    model = Post
    context_object_name = 'posts'
    ordering = ['-date_posted']
    paginate_by = 7

    def <b>get_template_names</b>(self):
        if request.user.is_authenticated:
            return ['page/index.html']
        else:
            return ['page/home.html']

Как сказано в документации, эта функция:

Возвращает список имен шаблонов для поиска при отображении шаблона.Первый найденный шаблон будет использоваться .

Если указано template_name, реализация по умолчанию вернет список, содержащий template_name (если он указан).

При этом, если вы не планируете отображать список на своей странице home.html, может быть лучше выполнить перенаправление на другую страницу, а не просто отображать страницу,В противном случае, если позднее вы захотите добавить больше контента на страницу home.html, вам каждый раз нужно будет обновить все представления, которые ее отображают.

Базовая реализация [GitHub] inTemplateResponseMixin [Django-doc] составляет:

def get_template_names(self):
    """
    Return a list of template names to be used for the request. Must return
    a list. May not be called if render_to_response() is overridden.
    """
    if self.template_name is None:
        raise ImproperlyConfigured(
            "TemplateResponseMixin requires either a definition of "
            "'template_name' or an implementation of 'get_template_names()'")
    else:
        return [self.template_name]
...