Django一个模板 - 多个视图 - 初学者

2 投票
1 回答
513 浏览
提问于 2025-04-17 22:54

我在很多人的帮助下,成功地用django 1.4.6和python 2.7创建了一个基本的测试博客。

我可以把博客文章以列表的形式展示在主页上,用户可以通过点击链接查看每一篇博客文章。

现在我想按作者和按归档(根据博客文章的发布时间)来展示博客文章。

我想知道,是否可以有一个博客页面,可以按日期(最新的在前)、按作者和按归档(日期 - 最新的在后)来列出博客?

我猜代码应该写在urls.py和views.py文件里,输出到单一的博客页面,但我还没有找到可以参考的例子,自己也有点搞不清楚。

这是我的models.py:

class BlogPostDetails(models.Model, FillableModelWithLanguageVersion):
    blog_post_title = models.CharField(max_length=50)
    blog_post_date_published = models.DateField()
    blog_post_author = models.CharField(max_length=25)
    blog_post_body = models.TextField()
    blog_post_allow_comments = models.BooleanField(default=False)
    blog_post_timestamp_added = models.DateTimeField(auto_now_add=True, auto_now=False)
    blog_post_timestamp_updated = models.DateTimeField(auto_now=True, auto_now_add=False)

    def __unicode__(self):
        return self.blog_post_title

    class Meta:
        ordering = ['-blog_post_date_published']
        verbose_name = ('Blog')
        verbose_name_plural = ('Blogs')

这是我的views.py:

def blog_post_item(request, blog_posts_id):
    blog_posts  = BlogPostDetails.objects.get(pk=blog_posts_id)
    language_versions = get_language_versions(user=request.user)
    return render(request, 'core/details/blog/blog_item.html', {
        'blog_posts': blog_posts,
        'display_default_language': display_default_language(request.user),
        'languages': LANGUAGES,
        'language_versions': language_versions,
        'language_versions_num': len(language_versions),
})

def blog_post_list(request):
    blog_posts = BlogPostDetails.objects.filter(blog_post_date_published__lt=datetime.today())
    language_versions = get_language_versions(user=request.user)
    return render(request, 'core/details/blog/blog_list.html', {
        'blog_posts': blog_posts,
        'display_default_language': display_default_language(request.user),
        'languages': LANGUAGES,
        'language_versions': language_versions,
        'language_versions_num': len(language_versions),
})

这是我的urls.py:

    url(r'^details/blog/blog_list/$', 'blog_post_list', name='blog_post_list'),
    url(r'^details/blog/blog_item/(?P<blog_posts_id>\d+)/$', 'blog_post_item', name='blog_post_item'),

1 个回答

0

一些建议:

  1. 在模型字段名称中不要使用模型名称的前缀,这样代码看起来会更好:

    class BlogPost(models.Model, FillableModelWithLanguageVersion):
        title = models.CharField(max_length=50)
        date_published = models.DateField()
        author = models.CharField(max_length=25)
        body = models.TextField()
        allow_comments = models.BooleanField(default=False)
        timestamp_added = models.DateTimeField(auto_now_add=True, auto_now=False)
        timestamp_updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    
        def __unicode__(self):
            return self.title
    
        class Meta:
            ordering = ['-date_published']
            verbose_name = ('Blog')
            verbose_name_plural = ('Blogs')
    
  2. 把django更新到1.6版本
  3. 使用基于类的视图(过滤和排序的示例

没错,你可以为你的任务使用一个模板

你应该把订单类型作为网址参数传递。

url(r'^details/blog/blog_list/(?P<order_type>\w+)/$', 'blog_post_list', name='blog_post_list'),


def blog_post_list(request, order_type='date_published'):
    blog_posts = BlogPost.objects.filter(date_published__lt=datetime.today()).order_by(order_type)
    language_versions = get_language_versions(user=request.user)
    return render(request, 'core/details/blog/blog_list.html', {
        'blog_posts': blog_posts,
        'display_default_language': display_default_language(request.user),
        'languages': LANGUAGES,
        'language_versions': language_versions,
        'language_versions_num': len(language_versions),
})

如果你想使用一个网址,我认为唯一的方法就是在页面上用javascript进行排序。

撰写回答