Herausforderung: DIY Django Mini Blog
In dieser Herausforderung werden Sie Ihr Wissen über Django, das Sie im Modul Django-Web-Framework (Python) erworben haben, nutzen, um einen sehr einfachen Blog zu erstellen.
Voraussetzungen: | Bevor Sie diese Herausforderung versuchen, sollten Sie alle Artikel in diesem Modul bereits durchgearbeitet haben. |
---|---|
Ziel: | Testen des Verständnisses der grundlegenden Konzepte von Django, einschließlich URL-Konfigurationen, Modelle, Ansichten, Formulare und Templates. |
Projektbeschreibung
Die zu darstellenden Seiten, ihre URLs und weitere Anforderungen sind unten aufgeführt:
Seite | URL | Anforderungen |
---|---|---|
Startseite | / und /blog/ |
Eine Indexseite, die die Website beschreibt. |
Liste aller Blogeinträge | /blog/blogs/ |
Liste aller Blogeinträge:
|
Detailseite des Blogautors (Blogger) |
/blog/blogger/<author-id>
|
Informationen zu einem bestimmten Autor (nach id) und Liste seiner Blogeinträge:
|
Detailseite eines Blogeintrags |
/blog/<blog-id>
|
Details eines Blogeintrags.
|
Liste aller Blogger | /blog/bloggers/ |
Liste der Blogger im System:
|
Kommentarseitenformular | /blog/<blog-id>/create |
Kommentar für Blogeintrag erstellen:
|
Benutzerauthentifizierungsseiten |
/accounts/<standard urls>
|
Standard-Django-Authentifizierungsseiten für das Ein- und Ausloggen sowie das Festlegen des Passworts:
|
Admin-Site |
/admin/<standard urls>
|
Die Admin-Site sollte aktiviert werden, um das Erstellen/Bearbeiten/Löschen von Blogeinträgen, Blogautoren und Blogkommentaren zu ermöglichen (dies ist der Mechanismus, mit dem Blogger neue Blogeinträge erstellen können):
|
Zusätzlich sollten Sie einige grundlegende Tests schreiben, um zu überprüfen:
- Alle Modellfelder haben das korrekte Label und die richtige Länge.
- Alle Modelle haben den erwarteten Objektnamen (z.B.,
__str__()
gibt den erwarteten Wert zurück). - Modelle haben die erwartete URL für einzelne Blog- und Kommentardatensätze (z.B.,
get_absolute_url()
gibt die erwartete URL zurück). - Die BlogListView (All-Blog-Seite) ist an der erwarteten Stelle zugänglich (z.B., /blog/blogs)
- Die BlogListView (All-Blog-Seite) ist unter der erwarteten benannten URL zugänglich (z.B., 'blogs')
- Die BlogListView (All-Blog-Seite) verwendet das erwartete Template (z.B., das Standardtemplate)
- Die BlogListView paginiert Datensätze um 5 (zumindest auf der ersten Seite)
Hinweis: Natürlich gibt es viele weitere Tests, die Sie durchführen können. Nutzen Sie Ihr Ermessen, aber wir erwarten, dass Sie mindestens die oben genannten Tests durchführen.
Der folgende Abschnitt zeigt Screenshots einer Seite, die die oben genannten Anforderungen umsetzt.
Screenshots
Die folgenden Screenshots bieten ein Beispiel dafür, wie das fertige Programm aussehen sollte.
Liste aller Blogeinträge
Diese zeigt die Liste aller Blogeinträge (zugänglich über den Link "Alle Blogs" in der Seitenleiste). Zu beachten:
- In der Seitenleiste wird auch der eingeloggte Benutzer aufgelistet.
- Einzelne Blogeinträge und Blogger sind als Links auf der Seite zugänglich.
- Paginierung ist aktiviert (in Gruppen von 5)
- Sortierung ist von neu nach alt.
Liste aller Blogger
Diese bietet Links zu allen Bloggern, verlinkt über den Link "Alle Blogger" in der Seitenleiste. In diesem Fall sehen wir aus der Seitenleiste, dass kein Benutzer eingeloggt ist.
Blog-Detailseite
Diese zeigt die Detailseite für einen bestimmten Blog.
Beachten Sie, dass die Kommentare ein Datum und eine Uhrzeit haben und von alt nach neu geordnet sind (Gegenteil der Blogsortierung). Am Ende haben wir einen Link zum Zugriff auf das Formular zum Hinzufügen eines neuen Kommentars. Wenn ein Benutzer nicht eingeloggt ist, würden wir stattdessen einen Vorschlag zum Einloggen sehen.
Kommentarformular hinzufügen
Dies ist das Formular zum Hinzufügen von Kommentaren. Beachten Sie, dass wir eingeloggt sind. Wenn dies erfolgreich ist, sollten wir zurück zur zugehörigen Blogeintragsseite gebracht werden.
Autoren-Bio
Diese zeigt biologische Informationen für einen Blogger zusammen mit ihrer Blogeintragsliste an.
Schritte zur Fertigstellung
Die folgenden Abschnitte beschreiben, was Sie tun müssen.
-
Erstellen Sie ein Gerüstprojekt und eine Webanwendung für die Website (wie in Django Tutorial Teil 2: Erstellen einer Gerüstwebsite beschrieben). Sie könnten 'diyblog' für den Projektnamen und 'blog' für den Anwendungsnamen verwenden.
-
Erstellen Sie Modelle für die Blogeinträge, Kommentare und weitere benötigte Objekte. Denken Sie bei Ihrem Design daran:
- Jeder Kommentar wird nur einen Blog haben, aber ein Blog kann viele Kommentare haben.
- Blogeinträge und Kommentare müssen nach Veröffentlichungsdatum sortiert werden.
- Nicht jeder Benutzer wird notwendigerweise ein Blogautor sein, obwohl jeder Benutzer ein Kommentator sein kann.
- Blogautoren müssen auch biografische Informationen enthalten.
-
Führen Sie Migrationen für Ihre neuen Modelle durch und erstellen Sie einen Superuser.
-
Verwenden Sie die Admin-Site, um einige Beispiel-Blogeinträge und -Kommentare zu erstellen.
-
Erstellen Sie Ansichten, Templates und URL-Konfigurationen für die Blog- und Blogger-Listen.
-
Erstellen Sie Ansichten, Templates und URL-Konfigurationen für die Blog- und Blogger-Details.
-
Erstellen Sie eine Seite mit einem Formular zum Hinzufügen neuer Kommentare (denken Sie daran, dass diese nur für eingeloggte Benutzer verfügbar ist!)
Hinweise und Tipps
Dieses Projekt ist sehr ähnlich zum LocalLibrary Tutorial. Sie können das Gerüst, das Benutzer-Anmelde-/Abmeldeverhalten, die Unterstützung für statische Dateien, Ansichten, URLs, Formulare, Basistemplates und die Admin-Site-Konfiguration mit nahezu denselben Ansätzen einrichten.
Einige allgemeine Hinweise:
-
Die Indexseite kann als einfache Funktionsansicht und Template implementiert werden (genau wie für die LocalLibrary).
-
Die Listenansicht für Blogeinträge und Blogger sowie die Detailansicht für Blogeinträge können mit generischen Listen- und Detailansichten erstellt werden.
-
Die Liste der Blogeinträge für einen bestimmten Autor kann erstellt werden, indem eine generische Bloglistenansicht verwendet und nach Blogobjekten gefiltert wird, die zum angegebenen Autor passen.
- Sie müssen
get_queryset(self)
implementieren, um die Filterung durchzuführen (ähnlich wie in unserer BibliotheksklasseLoanedBooksAllListView
) und die Autoreninformationen aus der URL abrufen. - Sie müssen auch den Namen des Autors auf der Seite im Kontext weitergeben. Um dies in einer klassenbasierten Ansicht zu tun, müssen Sie
get_context_data()
implementieren (weiter unten erläutert).
- Sie müssen
-
Das Kommentar hinzufügen Formular kann mit einer funktionsbasierten Ansicht (und zugehörigem Modell und Formular) oder einer generischen
CreateView
erstellt werden. Wenn Sie eineCreateView
verwenden (empfohlen), dann:-
Sie müssen auch den Namen des Blogeintrags zur Kommentarseite im Kontext weitergeben (implementieren Sie
get_context_data()
wie unten erläutert). -
Das Formular sollte nur die "Beschreibung" des Kommentars zur Benutzereingabe anzeigen (Datum und zugehöriger Blogeintrag sollten nicht bearbeitbar sein). Da sie nicht im Formular selbst sein werden, muss Ihr Code den Autor des Kommentars in der
form_valid()
Funktion setzen, damit er im Modell gespeichert werden kann (wie hier beschrieben — Django-Dokumentation). In derselben Funktion setzen wir den zugehörigen Blog. Eine mögliche Implementierung ist unten gezeigt (pk
ist eine Blog-ID, die aus der URL/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(BlogCommentCreate, self).form_valid(form)
-
Sie müssen eine Erfolgs-URL bereitstellen, auf die nach der Formularüberprüfung umgeleitet wird; diese sollte der ursprüngliche Blog sein. Dazu müssen Sie
get_success_url()
überschreiben und die URL für den ursprünglichen Blog "reverse"-en. Sie können die benötigte Blog-ID mit dem Attributself.kwargs
erhalten, wie in derform_valid()
Methode oben gezeigt.
-
Wir haben kurz darüber gesprochen, wie ein Kontext in der Django Tutorial Part 6: Generische Listen- und Detailansichten thematisiert wird. Dazu müssen Sie get_context_data()
überschreiben (zuerst den bestehenden Kontext abrufen, ihn mit zusätzlichen Variablen, die Sie dem Template übergeben möchten, aktualisieren und dann den aktualisierten Kontext zurückgeben). Das folgende Codefragment zeigt, wie Sie ein Bloggerobjekt basierend auf deren BlogAuthor
-ID dem Kontext hinzufügen können.
class SomeView(generic.ListView):
# …
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(SomeView, self).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
Die Bewertung für diese Herausforderung ist auf GitHub hier verfügbar. Diese Bewertung basiert hauptsächlich darauf, wie gut Ihre Anwendung die oben aufgeführten Anforderungen erfüllt, obwohl es einige Teile gibt, die überprüfen, ob Ihr Code geeignete Modelle verwendet, und ob Sie zumindest einige Testcodes geschrieben haben. Wenn Sie fertig sind, können Sie sich das fertige Beispiel ansehen, das ein Projekt mit "vollen Punkten" widerspiegelt.
Sobald Sie dieses Modul abgeschlossen haben, haben Sie auch alle MDN-Inhalte zum Lernen der grundlegenden Django-Server-Seiten-Programmierung abgeschlossen! Wir hoffen, Sie haben dieses Modul genossen und fühlen, dass Sie ein gutes Verständnis der Grundlagen haben!