2016-08-04 6 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オブジェクトを返します。それをURLにするには、film.get_next_by_date_published.slugにアクセスする必要があります。

それは{% url %}タグを使用することがよりよいですしかしあなたは、テンプレート

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

にURLをハードコーディングできます。

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

これで次の問題は、それぞれ最後または最初の映画ですでにある場合get_next_by_date_publishedget_previous_by_date_publishedDoesNotExist例外を発生させることができるということです。

私はテンプレート内でそれをやろうとするのではなく、ビュー内の次と前のフィルムを取り出すことをお勧めします。私は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

こんにちはAlasdairは、そのソリューションは完璧に働いた、私は十分に感謝することはできません!解決策を探す日の後、私は最終的に尋ねる勇気を得て、最初の返答はそれを釘付けにした。おかげで再び仲間:) – darcemac

関連する問題