Herausforderung: Ein eigener Django-Miniblog
In dieser Herausforderung nutzen Sie das Wissen, das Sie im Modul Django Web Framework (Python) erworben haben, um einen einfachen Blog zu erstellen.
| Voraussetzungen: | Bevor Sie diese Herausforderung angehen, sollten Sie alle Artikel dieses Moduls durchgearbeitet haben. |
|---|---|
| Ziel: | Ihr Verständnis der Django-Grundlagen zu überprüfen, einschließlich URL-Konfigurationen, Modellen, Views, Formularen und Templates. |
Projektbeschreibung
Die anzuzeigenden Seiten, ihre URLs und weitere Anforderungen sind nachstehend aufgeführt:
| Seite | URL | Anforderungen |
|---|---|---|
| Startseite | / und /blog/ |
Eine Übersichtsseite, die die Website beschreibt. |
| Liste aller Blogbeiträge | /blog/blogs/ |
Liste aller Blogbeiträge:
|
| Detailseite eines Blogautors (Bloggers) |
/blog/blogger/<author-id>
|
Informationen zu einem bestimmten Autor (anhand seiner ID) und eine Liste seiner Blogbeiträge:
|
| Detailseite eines Blogbeitrags |
/blog/blog/<blog-id>
|
Details zum Blogbeitrag.
|
| Liste aller Blogger | /blog/bloggers/ |
Liste der Blogger auf der Website:
|
| Seite mit dem Kommentarformular | /blog/blog/<blog-id>/comment/ |
Kommentar zu einem Blogbeitrag erstellen:
|
| Seiten zur Benutzerauthentifizierung |
/accounts/<standard urls>
|
Die standardmäßigen Django-Seiten zum An- und Abmelden sowie zum Festlegen des Passworts:
|
| Admin-Seite |
/admin/<standard urls>
|
Die Admin-Seite ist aktiviert, damit Blogbeiträge, Blogautoren und Blogkommentare erstellt, bearbeitet und gelöscht werden können (über diese Funktion erstellen Blogger neue Blogbeiträge):
|
Schreiben Sie außerdem einige grundlegende Tests, um Folgendes zu überprüfen:
- Alle Modellfelder haben die richtige Bezeichnung und Länge.
- Alle Modelle haben den erwarteten Objektnamen (z. B. gibt
__str__()den erwarteten Wert zurück). - Die Modelle liefern die erwartete URL für einzelne Blog- und BlogAuthor-Datensätze (z. B. gibt
get_absolute_url()die erwartete URL zurück). - Die BlogListView (Seite mit allen Blogbeiträgen) ist unter der erwarteten Adresse erreichbar (z. B. /blog/blogs).
- Die BlogListView (Seite mit allen Blogbeiträgen) ist über die erwartete benannte URL erreichbar (z. B. 'blogs').
- Die BlogListView (Seite mit allen Blogbeiträgen) verwendet das erwartete Template (z. B. das Standard-Template).
- Die BlogListView teilt Datensätze in Seiten mit jeweils 5 Einträgen auf (zumindest auf der ersten Seite).
Hinweis: Natürlich können Sie noch viele weitere Tests ausführen. Entscheiden Sie selbst, welche sinnvoll sind. Wir erwarten jedoch mindestens die oben genannten Tests.
Im folgenden Abschnitt finden Sie Screenshots einer Website, die die oben genannten Anforderungen erfüllt.
Screenshots
Die folgenden Screenshots zeigen beispielhaft, wie das fertige Programm aussehen sollte.
Liste aller Blogbeiträge
Hier wird die Liste aller Blogbeiträge angezeigt (erreichbar über den Link „All blogs“ in der Seitenleiste). Beachten Sie Folgendes:
- In der Seitenleiste wird auch der angemeldete Benutzer angezeigt.
- Einzelne Blogbeiträge und Blogger sind über Links auf der Seite erreichbar.
- Die Seitennummerierung ist aktiviert (jeweils 5 Einträge).
- Die Beiträge sind vom neuesten zum ältesten sortiert.

Liste aller Blogger
Diese Seite enthält Links zu allen Bloggern und ist über den Link „All bloggers“ in der Seitenleiste erreichbar. In diesem Beispiel zeigt die Seitenleiste, dass kein Benutzer angemeldet ist.

Detailseite eines Blogbeitrags
Dies ist die Detailseite eines bestimmten Blogbeitrags.

Beachten Sie, dass die Kommentare ein Datum und eine Uhrzeit haben und vom ältesten zum neuesten sortiert sind (also umgekehrt wie die Blogbeiträge). Am Ende befindet sich ein Link zum Formular für einen neuen Kommentar. Ist ein Benutzer nicht angemeldet, wird stattdessen ein Hinweis zur Anmeldung angezeigt.

Formular zum Hinzufügen eines Kommentars
Mit diesem Formular können Kommentare hinzugefügt werden. Beachten Sie, dass der Benutzer angemeldet ist. Nach erfolgreichem Absenden sollte die Seite des zugehörigen Blogbeitrags angezeigt werden.

Autorenbiografie
Diese Seite zeigt biografische Informationen über einen Blogger sowie eine Liste seiner Blogbeiträge.

Schritte zur Fertigstellung
Die folgenden Abschnitte beschreiben, was Sie tun müssen.
-
Erstellen Sie ein Grundgerüst für das Projekt und die Webanwendung (wie in Django-Tutorial Teil 2: Ein Website-Grundgerüst erstellen beschrieben). Sie können „diyblog“ als Projektnamen und „blog“ als Namen der Anwendung verwenden.
-
Erstellen Sie Modelle für Blogbeiträge, Kommentare und alle weiteren benötigten Objekte. Berücksichtigen Sie bei Ihrem Entwurf:
- Jeder Kommentar gehört zu genau einem Blogbeitrag, aber ein Blogbeitrag kann viele Kommentare haben.
- Blogbeiträge und Kommentare müssen nach Veröffentlichungsdatum sortiert werden.
- Nicht jeder Benutzer ist zwangsläufig ein Blogautor, aber jeder Benutzer kann Kommentare verfassen.
- Blogautoren benötigen außerdem biografische Informationen.
-
Führen Sie Migrationen für Ihre neuen Modelle aus und erstellen Sie einen Superuser.
-
Erstellen Sie über die Admin-Seite einige beispielhafte Blogbeiträge und Kommentare.
-
Erstellen Sie Views, Templates und URL-Konfigurationen für die Listenseiten der Blogbeiträge und Blogger.
-
Erstellen Sie Views, Templates und URL-Konfigurationen für die Detailseiten der Blogbeiträge und Blogger.
-
Erstellen Sie eine Seite mit einem Formular zum Hinzufügen neuer Kommentare (denken Sie daran, dass nur angemeldete Benutzer darauf zugreifen dürfen!).
Hinweise und Tipps
Dieses Projekt ähnelt stark dem LocalLibrary-Tutorial. Für das Grundgerüst, die An- und Abmeldung von Benutzern, die Unterstützung statischer Dateien, Views, URLs, Formulare, Basis-Templates und die Konfiguration der Admin-Seite können Sie weitgehend dieselben Ansätze verwenden.
Einige allgemeine Hinweise:
-
Die Startseite lässt sich mit einer einfachen funktionsbasierten View und einem Template umsetzen (genau wie bei LocalLibrary).
-
Die Listenansichten für Blogbeiträge und Blogger sowie die Detailansicht für Blogbeiträge können mit den generischen Listen- und Detailansichten erstellt werden.
-
Die Liste der Blogbeiträge eines bestimmten Autors können Sie mit einer generischen Blog-Listenansicht erstellen, die nach Blogobjekten des angegebenen Autors filtert.
- Für die Filterung müssen Sie
get_queryset(self)implementieren (ähnlich wie bei der KlasseLoanedBooksByUserListViewin unserem Bibliotheksprojekt) und die Autoreninformationen aus der URL abrufen. - Außerdem müssen Sie den Namen des Autors über den Kontext an die Seite übergeben. Implementieren Sie dazu in einer klassenbasierten View
get_context_data()(siehe unten).
- Für die Filterung müssen Sie
-
Das Formular zum Hinzufügen eines Kommentars lässt sich mit einer funktionsbasierten View (und dem zugehörigen Modell und Formular) oder mit einer generischen
CreateViewerstellen. Wenn Sie eineCreateViewverwenden (empfohlen):-
Müssen Sie auch den Titel des Blogbeitrags über den Kontext an die Kommentarseite übergeben (implementieren Sie
get_context_data()wie unten beschrieben). -
Das Formular sollte für Benutzereingaben nur das Beschreibungsfeld des Kommentars anzeigen (Datum und zugehöriger Blogbeitrag dürfen nicht bearbeitbar sein). Da diese Angaben nicht im Formular selbst enthalten sind, muss Ihr Code den Autor des Kommentars in der Funktion
form_valid()festlegen, damit er im Modell gespeichert werden kann (siehe Models and request.user in der Django-Dokumentation). In derselben Funktion legen wir den zugehörigen Blogbeitrag fest. Eine mögliche Implementierung ist unten gezeigt (pkist eine Blog-ID, die über die URL beziehungsweise URL-Konfiguration übergeben wird).pythondef form_valid(self, form): """ Add author and associated blog to form data before setting it as valid (so it is saved to model) """ # Add logged-in user as author of comment form.instance.author = self.request.user #Associate comment with blog based on passed id form.instance.blog=get_object_or_404(Blog, pk = self.kwargs['pk']) # Call super-class form validation behavior return super().form_valid(form) -
Müssen Sie eine Erfolgs-URL angeben, zu der nach erfolgreicher Validierung des Formulars weitergeleitet wird; dies sollte der ursprüngliche Blogbeitrag sein. Dazu müssen Sie
get_success_url()überschreiben und die URL für den ursprünglichen Blogbeitrag mit „reverse“ auflösen. Die benötigte Blog-ID erhalten Sie über das Attributself.kwargs, wie oben in der Methodeform_valid()gezeigt.
-
Im Abschnitt Django-Tutorial Teil 6: Generische Listen- und Detailansichten haben wir kurz besprochen, wie in einer klassenbasierten View ein Kontext an das Template übergeben wird. Dazu überschreiben Sie get_context_data(): Rufen Sie zunächst den vorhandenen Kontext ab, ergänzen Sie ihn um die Variablen, die Sie an das Template übergeben möchten, und geben Sie anschließend den aktualisierten Kontext zurück. Das folgende Codefragment zeigt beispielsweise, wie Sie anhand der ID eines BlogAuthor ein Blogger-Objekt zum Kontext hinzufügen.
class SomeView(generic.ListView):
# …
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super().get_context_data(**kwargs)
# Get the blogger object from the "pk" URL parameter and add it to the context
context['blogger'] = get_object_or_404(BlogAuthor, pk = self.kwargs['pk'])
return context
Bewertung
Für diese Herausforderung gibt es kein formelles Bewertungsschema. Wenn Ihre Anwendung funktioniert und die in diesem Artikel aufgeführten Anforderungen erfüllt, haben Sie die Aufgabe erfolgreich gelöst! Anschließend können Sie Ihren Code mit dem fertigen Beispiel vergleichen.
Mit Abschluss dieses Moduls haben Sie auch alle MDN-Inhalte zu den Grundlagen der serverseitigen Website-Programmierung mit Django durchgearbeitet! Wir hoffen, dass Ihnen das Modul gefallen hat und Sie nun die Grundlagen gut beherrschen!