2 Stimmen

Erstellen eines Nachrichtenarchivs in Django

Ich suche, um ein News-Archiv in Python / Django zu bauen, ich habe keine Ahnung, wo man mit ihm aber beginnen. Ich brauche die Ansicht, um alle Nachrichtenartikel mit ich habe getan, ich muss sie dann in Monaten und Jahren so z.B. teilen.

September 09 Okt 09

Ich brauche dann in der Ansicht zu einigen jedes Mal, wenn ein neuer Nachrichtenartikel für einen neuen Monat erstellt wird, muss es den neuen Monat ausgeben, so dass, wenn ein Nachrichtenartikel im November geschrieben wurde, das Archiv dann wäre,

September 09 Okt 09 Nov 09

Kann jemand helfen?

3voto

Ned Deily Punkte 81039

Ein hervorragender Startpunkt ist das Buch Praktische Django-Projekte von James Bennett. Es führt Sie unter anderem durch die Entwicklung eines Webblogs mit mehreren zeitbasierten Ansichten (nach Monat usw.), die Ihnen als Grundlage für Ihre Anwendung dienen sollten.

3voto

Adam Punkte 6589

Eine Möglichkeit, die Sie ausprobieren können, besteht darin, einen benutzerdefinierten Manager für Ihr Modell zu erstellen, der eine Möglichkeit bietet, die Archive herauszuziehen. Hier ist der Code, den ich verwende:

from django.db import models, connection
import datetime

class EntryManager(models.Manager):
    def get_archives(self, level=0):
        query = """
                    SELECT
                        YEAR(`date_posted`) AS `year`,
                        MONTH(`date_posted`) AS `month`,
                        count(*) AS `num_entries`
                    FROM
                        `blog_entry`
                    WHERE
                        `date_posted` <= %s
                    GROUP BY
                        YEAR(`date_posted`),
                        MONTH(`date_posted`)
                    ORDER BY
                        `year` DESC,
                        `month` DESC
                """
        months = ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')
        cursor = connection.cursor()
        cursor.execute(query, [datetime.datetime.now()])
        return [{'year': row[0], 'month': row[1], 'month_name': months[int(row[1])-1], 'num_entries': row[2]} for row in cursor.fetchall()]

Sie müssen es natürlich mit am Modell befestigen:

objects = EntryManager()

Dies gibt eine Liste von Wörterbüchern zurück, die das Jahr, den numerischen Monat, den Monatsnamen und die Anzahl der Einträge enthält. Sie rufen es als solches auf:

archives = Entry.objects.get_archives()

0voto

googletorp Punkte 32775

Es scheint, als ob Sie versuchen, eine einzelne Ansicht zu erstellen, die aus den Daten zieht und dann versuchen, sie nach Datum ect. zu ordnen. Ich glaube nicht, dass das der beste Weg wäre, dies zu tun.

Stattdessen könnten Sie eine Ansicht erstellen, in der die Artikel des jeweiligen Monats angezeigt werden. Ich kenne Ihre Modelle nicht, aber etwas wie:

articles = ArticleModel.objects.filter(date__month=month, date__year=year)

den Monat und das Jahr, die Sie aus Ihrer Url erhalten würden, fx archive/2009/9.

Wenn Sie sicherstellen wollen, dass nur Links zu Archiven mit Inhalt angezeigt werden, wäre eine einfache Lösung, alle Artikel zu sammeln und die Monate mit Inhalt zu markieren. Es sollte eine bessere Möglichkeit geben, das zu tun, aber wenn Sie es in eine Middleware einbauen und zwischenspeichern, sollte es kein Problem sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X