2016-06-25 15 views
0

Dies ist mein erstes Projekt in Django und ich habe mehrere verschiedene Tutorials verfolgt, von denen die meisten sehr nützlich sind. Ich habe einen sehr einfachen Blog als meine erste App erstellt und jetzt erweitere ich ihn ein wenig mehr als die Tutorials mir gezeigt haben. Ich habe nämlich das neue Modell Kategorie hinzugefügt, zu dem jeder Beitrag gehören kann. Das Modell selbst und alle verwandten Sachen funktionieren. Das einzige Problem, mit dem ich jetzt ein Problem habe, ist das Auflösen von URLs. Ich verwende Paginierung, um Posts normalerweise aufzulisten, aber ich würde gerne ein zusätzliches und optionales Element hinzufügen, nämlich Kategorie. Also, wenn Sie durch die Liste gerade habe ich nicht nur die Möglichkeiten der site.com/posts/?page=2 aber auch so etwas wie site.com/posts/?cat=news&page=2Django - Wie schließe ich mehrere Elemente in Paginierung ein?

models.py

# Model for blog post category 
class Category(models.Model): 
    title = models.CharField(max_length=120) 
    slug = models.SlugField(unique=True) 
    description = models.TextField() 

    class Meta: 
     verbose_name_plural = "Categories" 

    def __str__(self): 
     return self.title 

    def get_absolute_url(self): 
     return reverse("posts:detail", kwargs={"slug": self.slug}) 
# Model for blog post 
class Post(models.Model): 
    title = models.CharField(max_length=120) 
    slug = models.SlugField(unique=True) 
    category = models.ManyToManyField(Category, blank=True, through='CategoryToPost') 
    content = models.TextField() 
    image = FilerImageField(null=True, blank=True, related_name="post_image") 
    created = models.DateTimeField(auto_now=False, auto_now_add=True) 
    published = models.DateTimeField(auto_now=False, auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True, auto_now_add=False) 

    def __str__(self): 
     return self.title 

    def Category(self): 
     return self.category.all() 

    def get_absolute_url(self): 
     return reverse("posts:detail", kwargs={"slug": self.slug}) 
# Model for assigning post to a category 
class CategoryToPost(models.Model): 
    post = models.ForeignKey(Post) 
    category = models.ForeignKey(Category) 

urls.py

from .views import (
    post_list, 
    post_detail 
    ) 

urlpatterns = [ 
    url(r'^$', post_list), 
    url(r'^(?P<slug>[\w-]+)/$', post_detail, name='detail'), 
] 

Hinweis verwenden können Auf URLs lautet die Zeile aus dem Projekt urls.py url(r'^posts/', include("posts.urls", namespace='posts')),

views.py

def post_detail(request, slug): 

    instance = get_object_or_404(Post, slug=slug) 

    context = { 
     "title": instance.title, 
     "instance": instance, 
    } 

    return render(request, "post_single.html", context) 

def post_list(request): 

    queryset_list = Post.objects.all().order_by("-published") 
    paginator = Paginator(queryset_list, 5) 

    page = request.GET.get('page') 
    try: 
     queryset = paginator.page(page) 
    except PageNotAnInteger: 
     queryset = paginator.page(1) 
    except EmptyPage: 
     queryset = paginator.page(paginator.num_pages) 

    context = { 
     "title": "Post List", 
     "object_list": queryset, 
    } 

    return render(request, "post_list.html", context) 

Ich weiß, dass ich diese irgendwo in post_list hinzufügen müssen, aber um ehrlich zu sein ich nicht einmal sicher bin, wo ich anfangen soll und Paginierung Dokumentation django ist nicht ganz klar zu diesem Thema .

Antwort

1

views.py

... 
queryset_list = Post.objects.all().order_by("-published") 
if request.GET.get('cat'): 
    queryset_list = queryset_list.filter(category__slug=request.GET.get('cat')) 
... 

urls.py

from .views import (
    post_list, 
    post_detail 
    ) 

urlpatterns = [ 
    # Add name to url so that we can use it with reverse 
    url(r'^$', post_list, name='list'), 
    url(r'^(?P<slug>[\w-]+)/$', post_detail, name='detail'), 
] 

models.py

class Category(models.Model): 
    ... 
    def get_absolute_url(self): 
     return reverse('posts:list')+'?cat='+self.slug 
+0

Ja, danke, dass tatsächlich gearbeitet hat. Eine letzte Frage. Wie würde ich URL Resolver in Modellen anhängen, um immer Cat in Anfrage aufzunehmen? – Ablivion

+0

Ich folge nicht. Bitte erläutern. – xtranophilist

+0

die Modellkategorie hat eine Funktion get_absolute_url, so kann ich eine direkte Verbindung dazu bekommen. Gerade jetzt für Beiträge verwende ich 'url (r '^ (? P [\ w -] +)/$', post_detail, name = 'Detail'),' in urls.py. Ich muss eine zusätzliche URL hinzufügen, eine, die '? Cat =' enthalten wird. Ich habe die folgende Zeile hinzugefügt, habe damit herumgespielt, aber das Problem ist, ich bin mir nicht sicher, was der korrekte Reg-Ausdruck ist, um? Cat = darin einzufügen: 'url (r '^? Cat = (&? P [\ w -] +)/$ ', post_detail, name =' category '), ' – Ablivion

Verwandte Themen