2011-04-07 52 views
0

我正在創建一個小博客應用程序。我想返回帖子,和(我的問題),上一篇和下一篇文章,所以我可以將它們與帖子一起顯示。我目前的決定非常糟糕,因爲我不僅加載所有Post對象,還將QuerySet轉換爲列表。下面是views.py一個片段:Django博客應用程序架構問題

def post(request, url): 
     try: 
      post = Post.objects.get(slug = url) 
     except Post.DoesNotExist: 
      raise Http404() 
     posts = Post.objects.all().order_by('-date') 
     index = list(posts).index(post) 
     if index > 0: 
      ppost = posts[index - 1] #previuos post 
     else: 
      ppost = None 
     if index < len(posts): 
      npost = posts[index + 1] #next post 
     else: 
      npost = None 
     if not post.visible: 
      raise Http404() 
     return render_to_response('post.html', 
            {'post': post, 'ppost': ppost, 'npost': npost}, 
            context_instance=RequestContext(request)) 

這裏是models.py:

class Post(models.Model): 
    slug = models.SlugField(unique=True) 
    subject = models.CharField(max_length=150) 
    abstract = models.CharField(max_length=300) 
    content = models.TextField() 
    author = models.ForeignKey(User) 
    date = models.DateTimeField(auto_now_add=True) 
    visible = models.BooleanField(default=False) 
    tags = models.ManyToManyField(Tag, blank = True, null = True) 

    def save(self, *args, **kwargs): 
     self.abstract = self.content[:297] + "..." 
     self.slug = slugify(self.subject) 
     super(Post, self).save(*args, **kwargs) 

    def __unicode__(self): 
     return self.subject 

    class Meta: 
     ordering = ['-date'] 

我將不勝感激任何建築理念,如何實現這種情況。任何想法其實:)。謝謝你在前進

+0

也許有一個和下一個職位模型?不知道... – Kukmedis 2011-04-07 22:25:56

回答

2

你不必自己實現獲取下一個和以前的情況下,它已經內置:http://docs.djangoproject.com/en/1.3/ref/models/instances/#django.db.models.Model.get_previous_by_FOO

如果你要調整這一點,例如獲得非鄰近的情況下, -date場,看到this thread on django users

隨着你可以創建一個傳呼機這些模型方法在你的模板是這樣的:

<div id="pager"> 
    {% if object.get_prev_by_title %} 
     <a class="prev" href="{{ object.get_prev_by_title.get_absolute_url }}"> 
{{ object.get_prev_by_title }}</a> 
    {% endif %} 
    {% if object.get_next_by_title %} 
     <a class="next" href="{{ object.get_next_by_title.get_absolute_url }}"> 
{{ object.get_next_by_title }}</a> 
    {% endif %} 
</div> 
+0

現在很簡單。注意自己:總是檢查內置 – Kukmedis 2011-04-07 22:35:56