2016-07-11 5 views
0

Ich versuche, eine generische datumsklassenbasierte Ansicht für das Blog zu erstellen, das ich erstelle, aber es scheint nicht zu funktionieren. Das ist, was ich habe (regex von this gist inspiriert):Generische Möglichkeit, Django-Abfrage durch mehrere Felder (z. B. Datum) zu filtern?

"""Creativeflow URL Configuration the blog app.""" 
from django.conf.urls import url 
from .views import BlogListView, BlogDetailView 
urlpatterns = [ 
    url(r'posts/(?P<year>\d{4})/(?P<months>\d{2}|\w{3})/(?P<day>\d{2})/(?P<slug>\w+)', 
     BlogDetailView.as_view(), name="blog-detail"), 
    url(r'posts(?:/(?P<year>\d{4}))(?:/(?P<months>\d{2}|\w{3}))?(?:/(?P<day>\d{2}))?', 
     BlogListView.as_view(paginate_by=25), name="blog-list"), 
] 

Und meine Ansichten:

class BlogListView(ListView): 
    """CBV for list of blog posts.""" 

    model = Post 
    context_object_name = "blog_objects" 

    def get_query_set(self): 
     """Get the posts in the specified date range. 

     Year defaults to todays year 
     Month defaults to last month of the year 
     Day defaults to last day of the month 
     """ 
     now = datetime.now() 
     year = self.kwargs.get('year', now.year) 
     month = self.kwargs.get('month', 12) 
     day = self.kwargs.get('day', calendar.monthrange(year, month)[1]) 
     date = datetime.date(year=year, 
          month=month, 
          day=day) 
     print(date) 
     print('hello') 
     return Post.objects.filter(published__lt=date) 

zu http://blog.creativeflow.org.uk/posts/2016/07/09 Gehen liefern keine Daten bis zu der Vorlage, post_list.html:

{% extends "base.html" %} 
{% block content %} 
    <main> 
     {% for blog in blog_objects %} 
      <div> 
       <h3>{{ blog.title }}</h3> 
      </div> 
     {% endfor %} 
    </main> 
{% endblock content %} 

(ich kann die Basis schaffen, als auch wenn die Leute wollen)

Meine Absicht ist, dass der Zugriff auf posts/2016 bekommt alle 2016s Beiträge (weil es standardmäßig bis Ende 2016, dh 2016/12/31), posts/2016/02 erhält alle Beiträge von Februar 2016 (standardmäßig Ende Februar 2016, dh 2016/02/29) usw. Aber einen Fehler läuft resolve('/posts/2016/07/09') erzeugt, weil ich auf eine Sub-Domain bin, und from subdomains.utils import reverse Werke django-Subdomain zu verwenden ...

>>> reverse('blog-list', subdomain="blog", kwargs={"year":"2016", "months":"02", "day":"13"}) 
'http://blog.creativeflow.org.uk/posts/2016/02/13' 

aber mein Versuch im Browser zurückkehren etwas nicht. Ich bekomme auch nichts im Terminal gedruckt, wenn ich die Seite trotz meiner zwei Druckanweisungen aktualisiere.

Ich habe das Gefühl, dass etwas drastisch ist, das ich vermisse, das ist offensichtlich, aber ich kämpfe, um die Punkte zu verbinden.

Wie kann ich diese Route arbeiten lassen?

+0

Was ist der Unterschied zwischen Ihrer homebrew-Lösung und [diesem] (https://docs.djangoproject.com/en/1.9/ref/class-based-views/generic-date-based/)? –

+1

Sie verwenden das Schlüsselwort "Monate" in Ihrem URL-Muster, aber "Monat", wenn Sie versuchen, umzukehren. – Alasdair

+0

@ Two-BitAlchemist diese Methode erfordert mehrere Ansichten für jede Teilmenge, wenn es nur eine einzige Ansicht mit verschiedenen Ebenen der Filterung ist. – Pureferret

Antwort

0

Dies funktioniert, meine beiden Hauptprobleme waren

  1. Nicht Blogs in der DB
  2. Als Alasdair said mit:

    Sie verwenden das Schlüsselwort Monate in Ihrer URL-Muster, aber Monat, wenn Sie versuchen, umkehren.

Ich glaube, das ist alles, es dieses Problem zu beheben hat.

Verwandte Themen