Django一个模板 - 多个视图 - 初学者
我在很多人的帮助下,成功地用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
一些建议:
在模型字段名称中不要使用模型名称的前缀,这样代码看起来会更好:
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版本
- 使用基于类的视图(过滤和排序的示例)
没错,你可以为你的任务使用一个模板
你应该把订单类型作为网址参数传递。
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进行排序。