Herausforderung: DIY Django Mini-Blog
In dieser Herausforderung nutzen Sie das Wissen, das Sie im Django Web Framework (Python) Modul gesammelt haben, um einen sehr einfachen Blog zu erstellen.
Voraussetzungen: | Bevor Sie diese Herausforderung angehen, sollten Sie bereits alle Artikel in diesem Modul bearbeitet haben. |
---|---|
Ziel: | Das Verständnis der Django-Grundlagen wie URL-Konfigurationen, Modelle, Ansichten, Formulare und Templates zu testen. |
Projektbeschreibung
Die Seiten, die angezeigt werden müssen, ihre URLs und andere Anforderungen sind unten aufgeführt:
Seite | URL | Anforderungen |
---|---|---|
Startseite | / und /blog/ |
Eine Indexseite, die die Seite beschreibt. |
Liste aller Blogbeiträge | /blog/blogs/ |
Liste aller Blogbeiträge:
|
Blogautor (Blogger) Detailseite |
/blog/blogger/<author-id>
|
Informationen zu einem bestimmten Autor (nach ID) und Liste seiner Blogbeiträge:
|
Blogbeitrags-Detailseite |
/blog/<blog-id>
|
Details zum Blogbeitrag.
|
Liste aller Blogger | /blog/bloggers/ |
Liste der Blogger im System:
|
Kommentformularseite | /blog/<blog-id>/create |
Kommentar für Blogbeitrag erstellen:
|
Benutzerauthentifizierungsseiten |
/accounts/<standard urls>
|
Standard-Django-Authentifizierungsseiten zum Ein- und Ausloggen sowie zum Setzen des Passworts:
|
Admin-Seite |
/admin/<standard urls>
|
Die Admin-Seite sollte aktiviert sein, um das Erstellen/Bearbeiten/Löschen von Blogbeiträgen, Blogautoren und Blogkommentaren zu ermöglichen (dies ist der Mechanismus für Blogger, um neue Blogbeiträge zu erstellen):
|
Zusätzlich sollten Sie einige einfache Tests schreiben, um zu überprüfen:
- Alle Modelfeldnamen haben die richtige Bezeichnung und Länge.
- Alle Modelle haben den erwarteten Objektnamen (z. B. gibt
__str__()
den erwarteten Wert zurück). - Modelle verfügen über die erwartete URL für einzelne Blog- und Kommentaraufzeichnungen (z. B. gibt
get_absolute_url()
die erwartete URL zurück). - Die BlogListView (alle-Blog-Seite) ist an der erwarteten Stelle zugänglich (z. B. /blog/blogs)
- Die BlogListView (alle-Blog-Seite) ist an der erwarteten benannten URL zugänglich (z. B. 'blogs')
- Die BlogListView (alle-Blog-Seite) verwendet das erwartete Template (z. B. das Standard-Template)
- Die BlogListView paginiert Aufzeichnungen in 5er-Gruppen (mindestens auf der ersten Seite)
Hinweis: Es gibt natürlich viele andere Tests, die Sie ausführen können. Verwenden Sie Ihr Ermessen, aber wir erwarten, dass Sie mindestens die oben genannten Tests durchführen.
Der folgende Abschnitt zeigt Screenshots einer Site, die die oben genannten Anforderungen erfüllt.
Screenshots
Die folgenden Screenshots bieten ein Beispiel dafür, was das fertige Programm ausgeben sollte.
Liste aller Blogbeiträge
Diese zeigt die Liste aller Blogbeiträge (zugänglich über den Link "Alle Blogs" in der Seitenleiste). Zu beachten:
- Die Seitenleiste listet auch den eingeloggten Benutzer.
- Einzelne Blogbeiträge und Blogger sind als Links auf der Seite zugänglich.
- Die Seitennavigation ist aktiviert (in 5er-Gruppen).
- Die Reihenfolge ist von neuer zu älter.
Liste aller Blogger
Diese bietet Links zu allen Bloggern, da sie vom "Alle Blogger"-Link in der Seitenleiste verlinkt sind. In diesem Fall sehen wir in 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 ältestem zu neuestem geordnet sind (entgegengesetzt zur Blogordnung). Am Ende haben wir einen Link, um das Formular zum Hinzufügen eines neuen Kommentars zu erreichen. Wenn ein Benutzer nicht eingeloggt ist, würden wir stattdessen einen Vorschlag zum Einloggen sehen.
Kommentar-Hinzufügungsformular
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 Blogbeitragsseite gelangen.
Autorenbiografie
Dies zeigt biografische Informationen für einen Blogger zusammen mit seiner Liste von Blogbeiträgen.
Schritte zur Fertigstellung
Die folgenden Abschnitte beschreiben, was Sie tun müssen.
-
Erstellen Sie ein Skelettprojekt und eine Webanwendung für die Site (wie in Django Tutorial Teil 2: Erstellen eines Skelett-Websites beschrieben). Sie könnten 'diyblog' für den Projektnamen und 'blog' für den Anwendungsnamen verwenden.
-
Erstellen Sie Modelle für die Blogbeiträge, Kommentare und andere benötigte Objekte. Denken Sie beim Design an:
- Jeder Kommentar gehört zu nur einem Blog, aber ein Blog kann viele Kommentare haben.
- Blogbeiträge und Kommentare müssen nach Veröffentlichungsdatum sortiert werden.
- Nicht jeder Benutzer wird unbedingt ein Blogautor, 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-Seite, um einige Beispiel-Blogbeiträge und -kommentare zu erstellen.
-
Erstellen Sie Ansichten, Templates und URL-Konfigurationen für Blogbeiträge- und Bloggerlisten-Seiten.
-
Erstellen Sie Ansichten, Templates und URL-Konfigurationen für Blogbeiträge- und Blogger-Detailseiten.
-
Erstellen Sie eine Seite mit einem Formular zum Hinzufügen neuer Kommentare (denken Sie daran, diese nur für eingeloggte Benutzer verfügbar zu machen!)
Hinweise und Tipps
Dieses Projekt ist dem LocalLibrary Tutorial sehr ähnlich. Sie können das Skelett, das Benutzer-Login/Logout-Verhalten, die Unterstützung für statische Dateien, Ansichten, URLs, Formulare, Basistemplates und die Konfiguration der Admin-Seite fast auf dieselbe Weise einrichten.
Einige allgemeine Hinweise:
-
Die Indexseite kann als einfache Funktionsansicht und Template implementiert werden (genau wie bei der Lokalbibliothek).
-
Die Listenansicht für Blogposts und Blogger sowie die Detailansicht für Blogposts können mithilfe der generischen Listen- und Detailansichten erstellt werden.
-
Die Liste der Blogposts für einen bestimmten Autor kann erstellt werden, indem eine generische Blog-Listenansicht verwendet wird und nach Blogobjekten gefiltert wird, die zum angegebenen Autor passen.
- Sie müssen
get_queryset(self)
implementieren, um das Filtern vorzunehmen (ähnlich wie in unserer BibliotheksklasseLoanedBooksAllListView
) und die Autorinformationen aus der URL abrufen. - Sie müssen auch den Namen des Autors an die Seite im Kontext übergeben. Um dies in einer klassenbasierten Ansicht zu tun, müssen Sie
get_context_data()
implementieren (wie unten beschrieben).
- Sie müssen
-
Das Kommentar hinzufügen-Formular kann mit einer funktionsbasierten Ansicht (und dem zugehörigen Modell und Formular) oder mit einer generischen
CreateView
erstellt werden. Wenn Sie eineCreateView
verwenden (empfohlen), dann:-
Sie müssen auch den Namen des Blogbeitrags zur Kommentar-Seite im Kontext übergeben (implementieren Sie
get_context_data()
wie unten beschrieben). -
Das Formular sollte nur die Kommentar-"Beschreibung" für die Benutzer eingeben lassen (Datum und zugehöriger Blogbeitrag sollten nicht bearbeitbar sein). Da sie nicht im Formular selbst enthalten sind, 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 dieser 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 angeben, zu der nach der Validierung des Formulars weitergeleitet wird; dies sollte der ursprüngliche Blog sein. Dazu müssen Sie
get_success_url()
überschreiben und die URL für den Originalblog "umkehren". Sie können die benötigte Blog-ID über dasself.kwargs
Attribut erhalten, wie imform_valid()
Methode oben gezeigt.
-
Wir haben kurz darüber gesprochen, wie man in einer klassenbasierten Ansicht einen Kontext an das Template übergibt, in dem Django Tutorial Teil 6: Generische Listen- und Detailansichten Thema. Dazu müssen Sie get_context_data()
überschreiben (zuerst den vorhandenen Kontext abrufen, mit den zusätzlichen Variablen aktualisieren, die Sie an das Template übergeben möchten, und dann den aktualisierten Kontext zurückgeben). Zum Beispiel zeigt das untenstehende Codefragment, wie Sie ein Blogger-Objekt basierend auf ihrer BlogAuthor
-ID zum 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 hier auf GitHub 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 dass Sie zumindest etwas Testcode geschrieben haben. Wenn Sie fertig sind, können Sie sich das fertige Beispiel ansehen, welches ein Projekt mit "vollständigen Punkten" widerspiegelt.
Sobald Sie dieses Modul abgeschlossen haben, haben Sie auch alle MDN-Inhalte zum Erlernen der grundlegenden Django-Server-seitigen Website-Programmierung abgeschlossen! Wir hoffen, dass Ihnen dieses Modul gefallen hat und Sie ein gutes Verständnis der Grundlagen haben!