- 我们把一个字典变量template_var传递给模板welcome.html,默认欢迎辞为:欢迎您游客! 如果用户登录了,把用户名加上,request.user.is_authenticated()是request里的一个方法,用于判断用户是否登录。刚开始,是没有任何用户的,所以request.user.is_authenticated()将返回一个False,等我们注册了一个用户,登录了,便能认证了。
- 接下来我们写注册的功能。注册涉及到表单的提交,很自然我们就想到了django 的form,使用form生成表单,才能把表单的东西提交给views。
- 注册表单我们简单点,只有邮件,昵称和密码这三个输入框,form这样写:
- class RegisterForm(forms.Form):
- email=forms.EmailField(label=_(u"邮件"),max_length=30,widget=forms.TextInput(attrs={'size': 30,}))
- password=forms.CharField(label=_(u"密码"),max_length=30,widget=forms.PasswordInput(attrs={'size': 20,}))
- username=forms.CharField(label=_(u"昵称"),max_length=30,widget=forms.TextInput(attrs={'size': 20,}))
def clean_username(self):
- users = User.objects.filter(username__iexact=self.cleaned_data["username"])
- '''验证重复昵称'''
- if not users:
- return self.cleaned_data["username"]
- raise forms.ValidationError(_(u"该昵称已经被使用请使用其他的昵称"))
-
- def clean_email(self):
- '''验证重复email'''
- emails = User.objects.filter(email__iexact=self.cleaned_data["email"])
- if not emails:
- return self.cleaned_data["email"]
- raise forms.ValidationError(_(u"该邮箱已经被使用请使用其他的"))
-
- 表单的三个字段,forms.EmailField和forms.CharField都解析成html的input类型,其中EmailField字段会验证email格式的字符;widget=forms.PasswordInput顾名思义,会额外解析成type类型为密码型的input。
-
- RegisterForm有两个子方法,clean_username会到数据库找输入的昵称,检查是否有重复的昵称,起到验证的作用;clean_email同样验证是否有重复的邮件账号。两个子方法里使用到User实体,这是Django内置的用户实体,对应一个用户表。filter是model的过滤方法,字段_iexact 相当 where 字段 like '%参数%' 只是不区分大小写。
-
- form写好了,相当django生成表单的html,到views了,views将和form紧密结合,根据表单提交的数据做一些必要操作。请看代码:
- def register(request):
- '''注册视图'''
- template_var={}
- form = RegisterForm()
- if request.method=="POST":
- form=RegisterForm(request.POST.copy())
- if form.is_valid():
- username=form.cleaned_data["username"]
- email=form.cleaned_data["email"]
- password=form.cleaned_data["password"]
- user=User.objects.create_user(username,email,password)
- user.save()
- _login(request,username,password)#注册完毕 直接登陆
- return HttpResponseRedirect(reverse("index"))
- template_var["form"]=form
- return render_to_response("accounts/register.html",template_var,\
- context_instance=RequestContext(request))
-
- form初始的状态是未绑定数据的html代码,我们传给模板egister.html ,结果是三个空的input表单。当点击注册按钮提交数据时,form有个函数is_valid,是验证数据是否都符合条件。如果符合,直接填充给User实体,User.objects.create_user(username,email,password)就是构造出一个完整的实体,该方法便是User类内置的,很方便吧,不用再造轮子,重写注册的方法。user.save 就是把构造好的实体 保存到数据库里了。