2017-11-15 25 views
0

원하는 것은 장고에 "Next Post"와 "Previous Post"를 만드는 것입니다.Django의 "다음"및 "이전"버튼, Slug가있는 게시물

<a class="btn btn-default" href="{% url 'post_detail' slug=post.slug pk=post.pk|add:'1' %}">Next</a> 

이 두 가지 문제가 있습니다 : 내가 지금까지 어떻게 관리해야하는 것은 기본 키 위 하나 현재 포스트 아래 하나입니다 페이지에 단추를 연결하는 하나의 슬러그와 함께와 함께 URL 중 하나이며, 다른 하나는 버튼의 표시 (또는 숨기기)입니다.

다음을 클릭하면 다음 게시물로 이동합니다 (존재하는 경우 해당 페이지가 존재하지 않는다는 오류 메시지가 나타납니다). URL은 이전 게시물과 동일하게 유지됩니다. 세 번 클릭하면 표시된 URL이 두 번째 게시물 중 하나가됩니다. 내가 원하는 것은 어쨌든 해당 슬러그를 표시하는 것입니다.

두 번째 문제는 이전 또는 이후 게시물이없는 경우 단추를 비활성화하려는 것입니다. 그러나 다음 코드 조각은 다음과 같습니다.

{% if post.pk|add:'1' %} 

나는 지금까지 무엇을 생각해 냈습니다. 그러나 분명히 그 번호가 있는지 여부를 확인합니다. 게시물이 존재하는지 여부는 아닙니다. 모델 반면

class PostDetailView(HitCountDetailView): 
    model = Post 
    slug_field = "title" 
    count_hit = True 

(관련이없는 -에 -이 - 문제 코드 제거)한다 :

@python_2_unicode_compatible 
class Post(models.Model, HitCountMixin): 
    author = models.ForeignKey('auth.User') 
    title = models.CharField(max_length=100, null=False, blank=False) 
    text = models.TextField(null=False, blank=False) 
    slug = models.SlugField(max_length=100, blank=True) 

    # rewrite save method 
    def save(self, *args, **kwargs): 
     if not self.id: 
      self.slug = slugify(self.title) 
     super(Post, self).save(*args, **kwargs) 

    def article_pre_save(signal, instance, sender, **kwargs): 
     instance.slug = slugify(instance.title) 

    signals.pre_save.connect(article_pre_save, sender="blog.Post") 

    # go to post page 
    def get_absolute_url(self): 
     return reverse("post_detail", kwargs={'slug':self.slug, 'pk':self.pk}) 

    # retorna o título do post 
    def __str__(self): 
     return self.title 

및 관련 URL :

이 페이지의 뷰 클래스는 다음이다

url(_(r'^post/(?P<pk>\d+)-(?P<slug>[-\w]+)/$'), views.PostDetailView.as_view(), name='post_detail'), 

어떻게해야합니까? 나는 Raw SQL 쿼리를 작성하는 것에 대해 생각했다. (나는 이것 또한 문제가 있었지만 또 다른 문제이다.) 그러나 지금까지 어떻게 실제로 템플릿에 링크시킬 수 있는지 모르겠다. 원한다면, 당신의 도움에 감사 드리며, 사전에주의를 기울이십시오.

+1

'pk'에 1을 더하거나 빼는 것은 삭제 된 게시물이있을 수 있으므로 ** 좋은 방법이 아닙니다. 존재하지 않는 ID). 더 나은 방법은 뷰에서 템플릿으로 이전 및 다음 post _objects_ (날짜별로 정렬 된 쿼리 작성)를 전달하는 것입니다. 또는'post' 모델에'next_post'와'prev_post' 메소드를 추가 할 수 있습니다. – Selcuk

답변

3

django-next-prev 이러한 종류의 요구 사항에 대한 좋은 패키지입니다. 이 패키지는 현재 객체의 다음 객체와 이전 객체를 가져옵니다. 그런 다음 장고에서 reverse 또는 reverze_lazy 메소드를 사용하여 다음 및 이전 URL을 만들어야합니다.