django 一个模板 - 许多视图 - 初学者

Posted

技术标签:

【中文标题】django 一个模板 - 许多视图 - 初学者【英文标题】:django one template - many views - beginner 【发布时间】:2014-04-25 01:57:09 【问题描述】:

我已经设法(在很多帮助下)在 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】:

一些建议:

    您不应该在模型字段名称中使用模型名称前缀,因为您会看到代码看起来好多了:

    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')
    
    将 django 更新到 1.6 用户class-based views(过滤排序example)

是的 - 可以为您的任务使用一个模板

您应该将订单类型作为 url 参数传递。

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。

【讨论】:

以上是关于django 一个模板 - 许多视图 - 初学者的主要内容,如果未能解决你的问题,请参考以下文章

Django用pycharm初学习使用Django

用pycharm初学习使用Django

Django初学习:模板-上下文管理器的使用

Django:如何将相同的功能扩展到多个视图?

django ManyToMany 模型视图和模板

[教程]Django教程大纲初拟定