2016-08-04 9 views
0

Ich habe eine Blog-App als Teil eines Django-Tutorials erstellt und kann die Bloglistenansicht mit dem Code von djangoproject - https://docs.djangoproject.com/en/1.9/topics/pagination/#using-paginator-in-a-view paginieren. Ich habe nur Probleme beim Abrufen von Prev/Next URL Slug Links basierend auf der aktuellen Seite Post View.Django - Einzelpostansicht, Vorherige/Nächste Links

model.py

class Film(Timestamp): 
title = models.CharField(max_length=255) 
slug = models.SlugField(unique=True) 
image = ImageField(upload_to='thumb') 
video = EmbedVideoField(blank=True) 
director = models.CharField(max_length=255,blank=True) 
cinematographer = models.CharField(max_length=255,blank=True) 
producer = models.CharField(max_length=255,blank=True) 
publish = models.BooleanField(default=False) 
date_published = models.DateTimeField() 

# override the admin name 
class Meta: 
    verbose_name_plural = "Film Projects" 

def __unicode__(self): 
    return self.title 

# helper method 
def get_absolute_url(self): 
    return "/film/%s/" % self.slug 

def save(self, *args, **kwargs): 
     super(Film, self).save(*args, **kwargs) 

views.py

# film single 
def film_detail(request, slug): 

film = Film.objects.get(slug=slug) 

def get_next(self): 
    next_post = Film.get_next_by_date_published() 
    if next: 
     return next.first() 
    return False 

def get_next(self): 
    prev_post = Film.get_previous_by_date_published() 
    if prev: 
     return prev.first() 
    return False 

return render(request, 'film/film_detail.html', { 
    'film': film, 
}) 

urls.py

url(r'^film/$', views.film_list, name='film_list'), 
url(r'^films/(?P<slug>[-\w]+)/$', views.film_detail, name='film_detail'), 

film_detail.html

<a href="{{ film.get_next_by_date_published }}">Next</a><br> 
<a href="{{ film.get_previous_by_date_published }}">Previous</a> 

Die obigen Links geben den nächsten und vorherigen Posttitel zurück, nicht den Slug und beinhalten auch den aktuellen Post Slug, zum Beispiel - http://127.0.0.1:8000/films/sea-chair/Can Chair.

Für solch eine einfache Sache (obwohl ich zu Django und Python neu bin), habe ich Tage ohne Glück forschen, ich hoffe, dass jemand helfen kann!

Antwort

2

Die {{ film.get_next_by_date_published }} gibt ein Objekt film zurück. Um es in eine URL umzuwandeln, müssen Sie auf film.get_next_by_date_published.slug zugreifen.

Sie könnten die URL in der Vorlage

<a href="/films/{{ film.get_next_by_date_published }}">Next</a> 

aber es ist schöner zu verwenden, um den {% url %} Tag hart codieren.

<a href="{% url 'film_detail' film.get_previous_by_date_published.slug %}">Next</a> 

Das nächste Problem dabei ist, dass get_next_by_date_published und get_previous_by_date_published können eine DoesNotExist Ausnahme auslösen, wenn Sie bereits auf dem letzten oder ersten Film sind jeweils.

Ich würde vorschlagen, die nächsten und vorherigen Filme in der Ansicht zu holen, anstatt zu versuchen, es in der Vorlage zu tun. Beachten Sie, dass ich die get_object_or_404 Abkürzung verwendet habe, um den Fall zu behandeln, in dem ein Film mit diesem Slug nicht existiert.

from django.shortcuts import get_object_or_404 

def film_detail(request, slug): 

    film = get_object_or_404(Film, slug=slug) 
    try: 
     next_film = film.get_next_by_date_published() 
    except Film.DoesNotExist: 
     next_film = None 

    try: 
     previous_film = film.get_previous_by_date_published() 
    except Film.DoesNotExist: 
     previous_film = None 

    return render(request, 'film/film_detail.html', { 
     'film': film, 
     'next_film': next_film, 
     'previous_film': previous_film 
    }) 

dann in der Vorlage prüfen, ob next_film vorhanden ist, bevor die Verbindung zeigt:

{% if next_film %} 
<a href="{% url 'film_detail' next_film.slug %}">Next</a> 
{% else %} 
This is the last film! 
{% endif %} 
+1

Hallo Alasdair, diese Lösung funktionierte absolut perfekt, ich Ihnen nicht genug danken kann !!! Nach Tagen der Suche nach einer Lösung, bekam ich endlich den Mut zu fragen und die erste Antwort hat es geschafft. Danke nochmal Kumpel :) – darcemac

Verwandte Themen