Pinax源代码分析8 - blog
博客 app。
url
(r'^blog/', include('blog.urls')),
逻辑与模板
url(r'^post/(?P<username>[-/w]+)/(?P<year>/d{4})/(?P<month>/d{2})/(?P<slug>[-/w]+)/$', 'blog.views.post', name='blog_post'),
post view 负责显示一篇博客文章。
post 模板
{% extends "blog/base.html" %}
{% load comments_tag %}
{% load tagging_tags %}
{% load blog %}
{% load blog_tags %}
{% block extra_head %}
<link rel="alternate" type="application/atom+xml" title="Blog Post Feed for All Users" href="/feeds/posts/all/" />
<link rel="alternate" type="application/atom+xml" title="Blog Post Feed for User {{ post.author.username }}" href="/feeds/posts/only/{{ post.author.username }}/" />
{% endblock %}
<div class="blog-tags">
{% tags_for_object post as tags %}
{% for tag in tags %}
<a href="/tags/{{ tag }}">{{ tag }}</a>
{% endfor %}</p>
</div>
{% render_content post 'body' %}
<h3>Comments on This Post:</h3>
{% comments post %}
于之前的app类似,post会扩展本app 的 base.html, 并且base的主要任务也是提供子导航。
comments_tag 在 misc app 中定义,但是使用的是threadedcomments的模板'threadedcomments/comments.html'。从comments.html可以看出,它依赖于uni_form、pagination、avatar。
tagging_tags 在 tagging app 中定义,这里使用的是 tags_for_object 标签。
blog 和 blog_tags 都是 blog app 本身定义的标签。render_content 来自 blog.py,使用的是 'wiki/article_content.html' 模板,模板所使用的自定义标签都是使用的wiki app 自己定义的,所以不会以来其它的app了。感觉这里不太合理,blog 这个 app 应用了wiki的模板,模板标签等等,严重的couple了。
blogs
url(r'^$', 'blog.views.blogs', name="blog_list_all"),
url(r'^posts/(?P<username>/w+)/$', 'blog.views.blogs', name='blog_list_user'),
blogs view 负责显示一个 post 列表。
{% load extra_tagging_tags %}
{% load blog_tags %}
{% for blog_post in blogs %}
{% show_blog_post blog_post %}
{% endfor %}
extra_tagging_tags 并不是第三方app提供的,它是项目目录下,tag_app 的自定义标签。
show_blog_post 在 blog app 本身定义,它使用 "blog/blog_item.html" 模板。
操作
url(r'^your_posts/$', 'blog.views.your_posts', name='blog_list_yours'),
your_posts view 显示一个用户的所有posts。
url(r'^new/$', 'blog.views.new', name='blog_new'),
new view负责新建一篇post。
url(r'^edit/(/d+)/$', 'blog.views.edit', name='blog_edit'),
edit view 修改一篇post。
url(r'^destroy/(/d+)/$', 'blog.views.destroy', name='blog_destroy')
destroy view 删除一篇post。
问题
1.Pinax的博客是基于slug field来获取一篇文章的,但是要求 slug 域对于中文用户无疑是一个巨大的阻碍。
2.数据库存储的是原文和编码方式,然后在显示文章的时候在对内容进行转换。性能考虑,是不是应该存储HTML呢?
3.使用wiki app的模板,个人认为是严重的设计失误。