Как представления на основе классов определяют, какой файл шаблона будет вызываться? - PullRequest
1 голос
/ 13 марта 2019

вот код:

# urls.py

urlpatterns = [
    path("books/", views.BookListView.as_view(), name="books"),
]

и виды

# views.py

class BookListView(generic.ListView):
    model = Book

Book - это класс в models.py , в этом представлении используется шаблон book_list.html . Мой вопрос:

Почему он знает, какие шаблоны будут называться? Я даже не дал ему template_name . просто так

template_name = 'book_list.html'

Ответы [ 3 ]

1 голос
/ 13 марта 2019

Он будет искать book_list.html, потому что свойство template_name_suffix по умолчанию для этого класса определено как _list, что означает, что если вы не определите template_name или template_name_suffix самостоятельно, Django будет искатьшаблон book_list.html.

Часть book основана на том факте, что ваша модель называется Book, затем она соединяется с template_name_suffix, в данном случае с _list и, наконец, .html добавляется как расширение файла.

Вы можете посмотреть действительный код здесь .(ListView наследуется от MultipleObjectTemplateResponseMixin.)

0 голосов
/ 13 марта 2019

Общий ListView будет искать название модели и суффикс с _list.Посмотрите на класс ниже, который делает это в Django

class MultipleObjectTemplateResponseMixin(TemplateResponseMixin):
    """
    Mixin for responding with a template and list of objects.
    """
    template_name_suffix = '_list'

    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.
        """
        try:
            names = super(MultipleObjectTemplateResponseMixin, self).get_template_names()
        except ImproperlyConfigured:
            # If template_name isn't specified, it's not a problem --
            # we just start with an empty list.
            names = []

        # If the list is a queryset, we'll invent a template name based on the
        # app and model name. This name gets put at the end of the template
        # name list so that user-supplied names override the automatically-
        # generated ones.
        if hasattr(self.object_list, 'model'):
            opts = self.object_list.model._meta
            names.append("%s/%s%s.html" % (opts.app_label, opts.model_name, self.template_name_suffix))

        return names
0 голосов
/ 13 марта 2019

В ListView , если вы не укажете template_name явно, он берет имя модели в нижнем регистре и добавляет _list в конец.Например, ваша модель Book и она будет искать book_list.html

Если вы хотите, чтобы вместо _list применялся ваш собственный суффикс, вам нужно указать его следующим образом:

template_name_suffix = '_myown'

Кроме того, этот веб-сайт очень полезен для просмотра всех методов и использования представлений на основе классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...