Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

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:

  • Erreichbar für alle Benutzer über einen Link in der Seitenleiste.
  • Liste sortiert nach Veröffentlichungsdatum (neueste zuerst).
  • Liste paginiert in Gruppen von 5 Artikeln.
  • Listeneinträge zeigen den Blogtitel, das Veröffentlichungsdatum und den Autor an.
  • Blogtitel sind mit den Detailseiten der Blogs verlinkt.
  • Blogger (Autoren) sind mit den Detailseiten der Blogautoren verlinkt.
Detailseite des Blogautors (Blogger) /blog/blogger/<author-id>

Informationen zu einem bestimmten Autor (nach id) und Liste seiner Blogeinträge:

  • Erreichbar für alle Benutzer über Links zu Autoren in Blogeinträgen usw.
  • Enthält einige biografische Informationen über den Blogger/Autor.
  • Liste sortiert nach Veröffentlichungsdatum (neueste zuerst).
  • Nicht paginiert.
  • Listeneinträge zeigen nur den Namen des Blogeintrags und das Veröffentlichungsdatum.
  • Blogeintragstitel sind mit den Detailseiten der Blogs verlinkt.
Detailseite eines Blogeintrags /blog/<blog-id>

Details eines Blogeintrags.

  • Erreichbar für alle Benutzer über die Listen der Blogeinträge.
  • Seite enthält den Blogeintrag: Name, Autor, Veröffentlichungsdatum und Inhalt.
  • Kommentare zu dem Blogeintrag sollten unten angezeigt werden.
  • Kommentare sollten in der Reihenfolge vom ältesten zum neuesten sortiert sein.
  • Am Ende gibt es einen Link zum Hinzufügen von Kommentaren für eingeloggte Benutzer (siehe Kommentarseitenformular)
  • Blogeinträge und Kommentare müssen nur reinen Text anzeigen. Es ist nicht erforderlich, HTML-Markup (z.B. Links, Bilder, fett/kursiv, etc.) zu unterstützen.
Liste aller Blogger /blog/bloggers/

Liste der Blogger im System:

  • Erreichbar für alle Benutzer über die Seitenleiste der Website.
  • Bloggernamen sind mit den Detailseiten der Blogautoren verlinkt.
Kommentarseitenformular /blog/<blog-id>/create

Kommentar für Blogeintrag erstellen:

  • Erreichbar nur für eingeloggte Benutzer über den Link am Ende der Detailseiten der Blogeinträge.
  • Zeigt ein Formular mit Beschreibung zum Eingeben von Kommentaren an (Veröffentlichungsdatum und Blog sind nicht bearbeitbar).
  • Nachdem ein Kommentar gepostet wurde, wird die Seite zurück zur zugehörigen Blogeintragsseite umgeleitet.
  • Benutzer können ihre Beiträge nicht bearbeiten oder löschen.
  • Abgemeldete Benutzer werden zur Anmeldeseite weitergeleitet, um sich einzuloggen, bevor sie Kommentare hinzufügen können. Nachdem sie sich eingeloggt haben, werden sie zurück zur Blogseite geleitet, die sie kommentieren wollten.
  • Kommentarseiten sollten den Namen/Link zum kommentierten Blogeintrag enthalten.
Benutzerauthentifizierungsseiten /accounts/<standard urls>

Standard-Django-Authentifizierungsseiten für das Ein- und Ausloggen sowie das Festlegen des Passworts:

  • Anmeldung/Ausloggen sollte über Links in der Seitenleiste zugänglich sein.
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):

  • In den Admin-Site-Blogeinträgen sollten die zugehörigen Kommentare inline (unter jedem Blogeintrag) angezeigt werden.
  • Kommentarnamen in der Admin-Site werden erstellt, indem die Kommentarbeschreibung auf 75 Zeichen gekürzt wird.
  • Andere Arten von Datensätzen können die grundlegende Registrierung verwenden.

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 Blogs

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.

Liste aller Blogger

Blog-Detailseite

Diese zeigt die Detailseite für einen bestimmten Blog.

Blog-Detail mit Kommentar-Link

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.

Kommentar-Link wenn nicht eingeloggt

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.

Kommentarformular hinzufügen

Autoren-Bio

Diese zeigt biologische Informationen für einen Blogger zusammen mit ihrer Blogeintragsliste an.

Blogger-Detailseite

Schritte zur Fertigstellung

Die folgenden Abschnitte beschreiben, was Sie tun müssen.

  1. 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.

  2. 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.
  3. Führen Sie Migrationen für Ihre neuen Modelle durch und erstellen Sie einen Superuser.

  4. Verwenden Sie die Admin-Site, um einige Beispiel-Blogeinträge und -Kommentare zu erstellen.

  5. Erstellen Sie Ansichten, Templates und URL-Konfigurationen für die Blog- und Blogger-Listen.

  6. Erstellen Sie Ansichten, Templates und URL-Konfigurationen für die Blog- und Blogger-Details.

  7. 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:

  1. Die Indexseite kann als einfache Funktionsansicht und Template implementiert werden (genau wie für die LocalLibrary).

  2. Die Listenansicht für Blogeinträge und Blogger sowie die Detailansicht für Blogeinträge können mit generischen Listen- und Detailansichten erstellt werden.

  3. 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 Bibliotheksklasse LoanedBooksAllListView) 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).
  4. Das Kommentar hinzufügen Formular kann mit einer funktionsbasierten Ansicht (und zugehörigem Modell und Formular) oder einer generischen CreateView erstellt werden. Wenn Sie eine CreateView 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).

      python
          def 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 Attribut self.kwargs erhalten, wie in der form_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.

python
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!