Pinax源代码分析1
分析account package:
1 models.py
models.py定义的是数据库模型。除此之外,该文件还使用了其它的一些功能:
国际化(i18n)
setting文件里的USE_I18N = False/True控制了是否使用国际化功能。
account模块使用ugettext_lazy:
from django.utils.translation import ugettext_lazy as _
在需要的翻译的字符串上应用_()函数就可以了。
_('user')
当字符串中有多于一个placeholder的时候必须使用命名方式的替换,而不是位置方式。
标记了要翻译的字符串之后,需要创建翻译文件:在项目根文件夹运行:
django-admin.py makemessages -l de
默认只扫描html的文档,可以通过-e参数修改包括的后缀。
修改声称的.po文件,其中的msgstr就是翻译字符串。需要注意将po文件的编码调整为utf-8。
翻译完成之后运行:
django-admin.py compilemessages
主要参考:Internationalization
信号
models 使用了 post_save 信号。
from django.db.models.signals import post_save
def create_account(sender, instance=None, **kwargs):
if instance is None:
return
account, created = Account.objects.get_or_create(user=instance)
post_save.connect(create_account, sender=User)
最后一句表示,当User对象保存之后就调用create_account函数,这里该函数会试图给user创建一个account。
主要参考:Signals
2 urls.py、views.py和forms.py
urls定义了如何将各个url映射到对应的view上,views则定义了实际处理request的逻辑。
在urls中,每个url都包含一个name参数。例如:
url(r'^email/$', 'account.views.email', name="acct_email"),
这个name可以用于django.core.urlresolvers.reverse使用。
每个view都有一个form_class和template_name参数。不知道为什么要将用到的表单和模板以参数的形式传递给view函数。
forms定义了要使用的表单类。
3 templatetags
Django支持自定义标签和过滤器。
在account目录下包含一个templatetags子目录,里面有openid_tags.py和other_service_tags.py两个文件定义了自定义的标签,使用的时候需要在模板中现载入标签:
{% load openid_tags %}
open_id.py使用
register = template.Library()
register.simple_tag(openid_icon)
来注册了一个自定义标签。
other_service_tags.py:
@register.tag(name='other_service')
def other_service_tag(parser, token)
……
这个标签返回的是一个Node:
class OtherServiceNode(template.Node):
……
def render(self, context):
……
4 admin.py
admin.py将models注册到admin的管理之下。
文档:Admin site | Admin actions
5 context_processors.py
context_processors.py中是用户自定的context_processors。一个context_processor接受一个参数——request,返回一个字典。字典将被添加到模板的context中。
使用之前,在settings中需要激活:
TEMPLATE_CONTEXT_PROCESSORS = (
……
"account.context_processors.openid",
"account.context_processors.account",
……
)
参考: Template API
6 middleware.py
一个middleware是定义了几个特定方法的类。accout的LocaleMiddleware定义了process_request和process_response方法。它根据用户的语言设置来决定响应的语言。使用之前需要在settings中激活:
MIDDLEWARE_CLASSES = (
……
'account.middleware.LocaleMiddleware',
……
)
参考:Middleware: Overview