voici le code:
template_name = 'book_list.html'
et les vues
# views.py
class BookListView(generic.ListView):
model = Book
Book est une classe de models.py , cette vue utilisera le modèle book_list.html . Ma question est:
Pourquoi sait-il quels modèles seront appelés? Je ne lui ai même pas donné le nom_modèle . juste comme ça
# urls.py
urlpatterns = [
path("books/", views.BookListView.as_view(), name="books"),
]
3 Réponses :
Dans ListView , lorsque vous ne spécifiez pas explicitement template_name , il prend le nom du modèle en minuscules et ajoute _list à la fin. Comme votre modèle est Book et il recherchera book_list.html
Si vous voulez que votre propre suffixe soit appliqué au lieu de _list , vous devez le spécifier comme ceci:
template_name_suffix = '_myown '
Il recherchera la book_list.html car la propriété par défaut template_name_suffix pour cette classe est définie comme _list , ce qui signifie que si vous ne définissez pas vous-même un template_name ou template_name_suffix , Django recherchera le modèle book_list.html .
La partie book vient du fait que votre modèle s'appelle Book , il est alors concaténé avec template_name_suffix , dans ce cas avec < code> _list et enfin, .html est ajouté comme extension de fichier.
Vous pouvez consulter le code réel ici . ( ListView hérite de MultipleObjectTemplateResponseMixin .)
Generic Listview cherchera le nom du modèle et le suffixe avec '_list'. Jetez un œil à la classe ci-dessous qui fait cela dans 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