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 一个模板 - 许多视图 - 初学者的主要内容,如果未能解决你的问题,请参考以下文章