Как реализовать функцию get_template_names () в CBV? - PullRequest
0 голосов
/ 18 сентября 2018

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

Это мои два представления выглядят так:

class bloglistview(LoginRequiredMixin,ListView):
model = Blog


def get_queryset(self):
    return Blog.objects.filter(User=self.request.user).order_by('id')

def get_context_data(self, **kwargs):
    context = super(bloglistview, self).get_context_data(**kwargs) 
    context['categories_list'] = categories.objects.all()
    return context

class allbloglistview(LoginRequiredMixin,ListView):
model = Blog

def get_queryset(self):
    return Blog.objects.all().order_by('id')

def get_context_data(self, **kwargs):
    context = super(allbloglistview, self).get_context_data(**kwargs) 
    context['categories_list'] = categories.objects.all()
    return context

Кто-нибудь может мне помочь в этом?

1 Ответ

0 голосов
/ 18 сентября 2018

Если имя шаблона не зависит от определенных параметров (параметры URL, GET параметры, POST параметры, COOKIES и т. Д.), Вы можете просто указать атрибут template_name, например:

class bloglistview(LoginRequiredMixin,ListView):

    model = Blog
    <b>template_name = 'my_fancy_template.hmtl'</b>

    def get_queryset(self):
        return Blog.objects.filter(User=self.request.user).order_by('id')

    def get_context_data(self, **kwargs):
        context = super(bloglistview, self).get_context_data(**kwargs) 
        context['categories_list'] = categories.objects.all()
        return context

В случае, если шаблон разрешен динамически (как в зависимости от некоторых параметров URL или других параметров), вы можете переопределить функцию get_template_names, которая должна возвращать список из строки: имя шаблонов, которые ищутся в этом порядке. Например:

class bloglistview(LoginRequiredMixin,ListView):

    model = Blog

    def <b>get_template_names</b>(self):
        if self.request.COOKIES.get('mom'):  # a certain check
            return ['true_template.html']
         else:
            return ['first_template.html', 'second_template.html']

    def get_queryset(self):
        return Blog.objects.filter(User=self.request.user).order_by('id')

    def get_context_data(self, **kwargs):
        context = super(bloglistview, self).get_context_data(**kwargs) 
        context['categories_list'] = categories.objects.all()
        return context

Но, как вы, вероятно, видите, это сложнее, и, следовательно, его следует использовать только в том случае, если имя шаблона зависит от "контекста".

Функция get_template [GitHub] определит, какой шаблон использовать. Если первый шаблон не существует, будет пробоваться следующий, пока функция не найдет шаблон.

...