2016-08-04 83 views
0

我建立了一個博客的應用程序作爲Django的教程中,我可以使用分頁從djangoproject代碼的博客列表視圖 - https://docs.djangoproject.com/en/1.9/topics/pagination/#using-paginator-in-a-view。我只是在根據當前頁面發佈視圖檢索Prev/Next url slug鏈接時遇到問題。Django的 - 單後視圖,上一頁/下一頁鏈接

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> 

上面的鏈接返回下一個和以前的帖子標題,而不是蛞蝓和包括當前職位塞爲好,例如 - http://127.0.0.1:8000/films/sea-chair/Can主席。

對於這樣一個簡單的事情(雖然我是新來的Django和Python),我花了幾天,沒有運氣研究,我希望有人能夠幫助!

回答

2

{{ film.get_next_by_date_published }}返回film對象。要將其變成網址,您需要訪問film.get_next_by_date_published.slug

你可以在模板

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

然而,它的更好的使用{% url %}標籤硬編碼的URL。

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

這個接下來的問題是,get_next_by_date_publishedget_previous_by_date_published可以提高一個DoesNotExist異常,如果你分別已經在最後或第一部電影。

我建議獲取下一個和以前的電影中的觀點,而不是試圖做模板。請注意,我用的get_object_or_404快捷方式,來處理情況,與塞,膜不存在的情況下。

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 
    }) 

然後在你的模板,檢查next_film存在顯示鏈接之前:

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

嗨麥金太爾,該解決方案的工作絕對完美的,我不能感謝你纔好!在尋找解決方案的幾天之後,我終於鼓起勇氣問道,第一個回覆就明白了。再次感謝隊友:) – darcemac

相關問題