Pinax源代码分析6 - account
account —— 帐户管理package,在lib/pinax/ 目录下。
url
(r'^account/', include('account.urls')),
逻辑与模板
依赖:
from emailconfirmation.models import EmailAddress, EmailConfirmation
from django_openid.models import UserOpenidAssociation
url(r'^email/$', 'account.views.email', name="acct_email"),
email view 负责添加邮箱、发送确认邮件、删除邮件、设置主要邮箱。
email 模板
{% extends "account/base.html" %}
{% load i18n %}
{% load uni_form %}
<form method="post" action="" class="uniForm">
<fieldset class="inlineLabels">
{{ add_email_form|as_uni_form }}
<div class = "form_block">
<input type="hidden" name="action" value="add"/>
<input type="submit" value="{% trans "add" %}"/>
</div>
</fieldset>
</form>
该模板扩展了base.html,base.html在项目文件夹下,主要负责提供account模块的子导航条。
uniform在lib目录下的一个第三方app,as_uni_form是一个自定义filter,以div来展示表单。
url(r'^signup/$', 'account.views.signup', name="acct_signup"),
signup view 负责用户注册。
signup 模板
{% extends "site_base.html" %}
{% load jquery_validation %}
{% include_validation %}
<script type="text/javascript">
$(function(){
$('#signup_form').validate('{% url signup_form_validate %}', {type: 'table', fields: ['username'], dom: $('#id_username'), event: 'change'});
$("#id_username").focus();
});
</script>
jquery_validation是ajax_validation app 定义的自定义标签,{% include_validation %}的作用就是包含进来验证表单需要的js脚本。signup_form_validate定义在: (r'^validate/$', 'ajax_validation.views.validate', {'form_class': SignupForm}, 'signup_form_validate')。
url(r'^login/$', 'account.views.login', name="acct_login"),
url(r'^login/openid/$', 'account.views.login', {'associate_openid': True}, name="acct_login_openid"),
login view 负责用户登录,支持使用openid。
login 模板
{% extends "site_base.html" %}
{% load ifsetting_tag %}
{% ifsetting ACCOUNT_OPEN_SIGNUP %}
{% url acct_signup as signup_url %}
<p>{% blocktrans %}Don't have an account? <a href="{{ signup_url }}">Sign up</a>!{% endblocktrans %}</p>
{% endifsetting %}
其中 ifsetting_tag 在 misc app 中定义。
password
url(r'^password_change/$', 'account.views.password_change', name="acct_passwd"),
url(r'^password_set/$', 'account.views.password_set', name="acct_passwd_set"),
url(r'^password_delete/$', 'account.views.password_delete', name="acct_passwd_delete"),
url(r'^password_delete/done/$', 'django.views.generic.simple.direct_to_template', {
"template": "account/password_delete_done.html",
}, name="acct_passwd_delete_done"),
url(r'^password_reset/$', 'account.views.password_reset', name="acct_passwd_reset"),
# Setting the permanent password after getting a key by email
url(r'^password_reset_key/$', 'account.views.password_reset_from_key', name="acct_passwd_reset_key"),
修改密码,设置密码(原来密码为空),删除密码(如果有openid就可以删除),重置密码,
url(r'^timezone/$', 'account.views.timezone_change', name="acct_timezone_change"),
修改时区设置。Pinax的时区设置使用的是django_timezones中的timezones app。例如:
class Account(models.Model):
……
timezone = TimeZoneField(_('timezone'))
……
class ChangeTimezoneForm(AccountForm):
timezone = TimeZoneField(label=_("Timezone"), required=True)
……
url(r'^language/$', 'account.views.language_change', name="acct_language_change"),
修改语言设置。
other_services
url(r'^other_services/$', 'account.views.other_services', name="acct_other_services"),
url(r'^other_services/remove/$', 'account.views.other_services_remove', name="acct_other_services_remove"),
借助于django_microblogging 的 microblogging app 实现对 twitter 绑定的支持。估计Pinax的作者是希望可以集合多个服务,而不只是twitter一个,所以才使用pther_services这个名字。
url(r'^logout/$', 'django.contrib.auth.views.logout', {"template_name": "account/logout.html"}, name="acct_logout"),
退出。
url(r'^confirm_email/(/w+)/$', 'emailconfirmation.views.confirm_email', name="acct_confirm_email"),
使用emailconfirmation app 的view来处理。模板在 default 主题里。