Beim letzten Mal konnte ich in Django-Tutorial (Erstellung von Blog-Anwendungen) ② - Modellerstellung, Vorbereitung der Verwaltungssite bis zur Erstellung eines Artikels auf der Verwaltungssite bestätigen.
Dieses Mal können wir eine Liste der Artikel anzeigen, die auf der Verwaltungssite erstellt wurden.
Lassen Sie uns zuerst eine Vorlage erstellen. Erstellen Sie post_list.html unter Vorlagen / Blog.
└── templates
└── blog
├── index.html
└── post_list.html
Hier ist eine kleine wichtige Erklärung.
In Django können Sie einfach ein Modell abrufen, um einen Artikel anzuzeigen, indem Sie einen Mechanismus verwenden, der als ** klassenbasierte Allzweckansicht ** bezeichnet wird. Sie können die Vorlage anzeigen und Apps effizient erstellen. Übrigens, als ich das letzte Mal mit views.py herumgespielt habe, gab es eine Notation ** generic **, die auch eine notwendige Deklaration zur Vorbereitung auf die Verwendung klassenbasierter generischer Ansichten ist.
view.py
from django.views.generic import TemplateView
Es gibt verschiedene Arten von generischen Klassenansichten, von denen diejenige nur zum Anzeigen der Vorlage verwendet wurde. Dies ist die ** TemplateView **, mit der index.html angezeigt wird. Um index.html anzuzeigen, wurde die aufzurufende Vorlage in views.py angegeben.
view.py
class IndexView(TemplateView):
template_name = 'blog/index.html'
Außerdem wurde es aus Gründen der Klarheit bisher als genetisch deklariert und anschließend die zu verwendende Klasse angegeben und importiert. Sie können es auch in Form von generic.xxxView aufrufen, also schreiben wir views.py ein wenig um.
views.py(Nach dem Umschreiben)
from django.views import generic
class IndexView(genetic.TemplateView):
template_name = 'blog/index.html'
Ich werde viele klassenbasierte generische Ansichten aufrufen, daher habe ich die erste Deklaration bereinigt.
Dieses Mal müssen wir nicht nur die Vorlage einfach anzeigen, sondern auch das Informationsmodell des Artikels aus der Datenbank aufrufen. Daher verwende ich eine andere klassenbasierte generische Ansicht namens ** ListView **, aber die Verwendung ähnelt der von TemplateView.
Sie müssen lediglich das Modell deklarieren, das Sie zuerst verwenden möchten, die Klasse schreiben und das aufzurufende Modell angeben.
views.py(ListView hinzufügen)
from django.views import generic
from .models import Post #Post-Modell importieren
class IndexView(genetic.TemplateView):
template_name = 'blog/index.html'
class PostListView(generic.ListView): #Erben Sie die generische ListView-Klasse
model = Post #Rufen Sie das Modell auf, das Sie auflisten möchten
Durch Einfügen des Beschreibungsmodells = Post kann die Artikelliste als Listentyp mit einer Variablen ** post_list ** an die Vorlage übergeben werden.
Diejenigen, die sich an die Zeit erinnern, als TemplateView hier verwendet wurde, und dachten: "Warum geben Sie die Vorlage nicht an?" Sind scharf.
Natürlich können Sie es angeben, aber tatsächlich hat generic.ListView eine praktische Funktion, die es aufruft, auch wenn Sie es nicht angeben, indem Sie den Dateinamen der Vorlage gemäß der Regel festlegen. (Da es jedoch für Dritte einfacher ist, dies klar anzugeben, denke ich, dass es absichtlich beschrieben werden kann.)
Die Regel besteht darin, den Modellnamen zu verringern, z. B. "post_list.html", und im Fall von ListView die durch einen Unterstrich getrennte Zeichenfolge "list" als Dateinamen zu verwenden. (Es hängt von der Klasse ab, die Sie verwenden, daher werde ich es später erklären.)
Jetzt haben Sie eine Ansicht, in der die Vorlage post_list.html angezeigt wird und gleichzeitig die Liste der Artikel an die Vorlage übergeben wird.
Um das an post_list.html übergebene Modell zu erhalten, gibt es eine für Django eindeutige Beschreibungsmethode.
In Djangos Vorlage können Sie Python-Code schreiben, indem Sie ihn in ** {%%} ** einfügen. Um den Wert im Browser als HTML anzuzeigen, können Sie ** {{}} ** mit einer mittleren Klammer verwenden. Beschreiben.
Diesmal ist die Artikelliste ein Listentyp mit dem Namen ** post_list **, und die Variablen werden als Vorlage übergeben. Erweitern Sie sie daher mit einer for-Schleife und extrahieren Sie jeden Artikeltitel und jedes Datum. (Daten für jede Spalte können abgerufen werden, indem der Spaltenname mit Punkten im Variablennamen angegeben wird.)
post_list.html
<h1>Liste der Artikel</h1>
<table class="table">
<thead>
<tr>
<th>Titel</th>
<th>Datum</th>
</tr>
</thead>
<tbody>
{% for post in post_list %}
<tr>
<td>{{ post.title }}</td>
<td>{{ post.date }}</td>
</tr>
{% endfor %}
</tbody>
</table>
Bearbeiten Sie blog / urls.py, um ListView aufzurufen, wenn Sie das letzte Mal auf die URL zugreifen, um die Artikelliste anzuzeigen.
blog/urls.py
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('list', views.PostListView.as_view(), name='list'), #Hier hinzufügen
]
Beachten Sie, dass Ansicht, Vorlage und URL bei der Anzeige dieser Zeit eine Rolle spielen.
Nachdem das Modell angezeigt werden kann, führen wir runserver aus, um auf die URL zuzugreifen. Da ich den URL-Pfad namens list in der Blog-App früher festgelegt habe, Sie können es unter der URL ** 127.0.0.1:8000/blog/list** anzeigen.
Die Tabelle ist nicht cool, aber Sie können sehen, dass die auf der Verwaltungssite registrierten Artikel angezeigt werden.
Es ist schwer zu verstehen, ob es nur einen gibt. Fügen wir also etwa zwei Artikel von der Verwaltungssite hinzu und überprüfen Sie sie erneut.
Sie können sehen, dass Titel und Datum jeweils abgerufen werden können.
Nächstes Mal erstellen wir einen Komponententest, der den Test automatisiert.
→ Nächstes Mal Django-Tutorial (Blog-App erstellen) ④ - Einheitentest
Recommended Posts