【问题标题】:Django blog app architectural problemDjango 博客应用程序架构问题
【发布时间】:2011-04-07 21:59:12
【问题描述】:

我正在创建小博客应用程序。我想返回帖子,以及(我的问题)上一个和下一个帖子,所以我可以将它们与帖子一起显示。我目前的决定非常糟糕,因为我不仅加载了所有 Post 对象,而且还将 QuerySet 转换为列表。这是来自views.py的sn-p:

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']

我会很感激任何架构想法,如何实现这个案例。实际上有任何想法:)。提前谢谢你

【问题讨论】:

  • 模型中可能有上一个和下一个帖子?不知道...

标签: python django django-views


【解决方案1】:

您不必自己实现获取下一个和上一个实例,它已经内置:http://docs.djangoproject.com/en/1.3/ref/models/instances/#django.db.models.Model.get_previous_by_FOO

如果您想稍微调整一下,例如获取非日期字段的相邻实例,请参阅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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2015-08-18
    • 1970-01-01
    • 2011-10-05
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多