用户信息模块包括“用户信息的注册”“用户登录”“显示用户信息”和“用户密码的修改”。其中“用户信息的注册”与“用户登录”在本书第2章进行了详细地描述,这一章将进行系统地归纳与优化。数据模型如下。
...#用户class User(models.Model): username = models.CharField(max_length=50) #用户名 password = models.CharField(max_length=50) #密码 email = models.EmailField() #Email def __str__(self): return self.username ... |
---|
只有通过用户注册的用户才可以登录系统,根据需求,在这个系统中用户注册需要填写用户登录名、密码和Emil地址。
...url(r'^register/$', views.register), ... |
---|
把所有的表单定义在一个名为forms.py的文件中,用户注册的表单定义如下。
...from django import forms #定义注册表单模型class UserForm(forms.Form): username = forms.CharField(label='用户名',max_length=100) password = forms.CharField(label='密码',widget=forms.PasswordInput())email = forms.EmailField(label='电子邮件')... |
---|
在这里。
(1)username 中的max_length=100表示输入的最大字符限制在100个。
(2)password 中的widget=forms.PasswordInput()表示文本信息为密码格式。
(3)email中的EmailField表示格式为HTML5中的Email格式。
然后在views.py中通过fromgoods.forms import UserForm来引入。下面是views.py中关于注册的代码。
...from goods.forms import UserForm...#用户注册def register(request): if request.method == "POST": #判断表单是否提交状态 uf = UserForm(request.POST) #获得表单变量 if uf.is_valid(): #判断表单数据是否正确 #获取表单信息 username = (request.POST.get('username')).strip() #获取用户名信息 password = (request.POST.get('password')).strip() #获取密码信息 email = (request.POST.get('email')).strip()#获取Email信息#查找数据库中是否存在相同用户名 user_list = User.objects.filter(username=username) if user_list:#如果存在,报"用户名已经存在!"错误信息并且回到注册页面return render_to_response('register.html',{'uf':uf,"error":"用户名已经存在!"}) else: #否则将表单写入数据库 user = User() user.username = username user.password = password user.email = email user.save() #返回登录页面 uf = LoginForm() return render_to_response('index.html',{'uf':uf}) else: #如果不是表单提交状态,显示表单信息 uf = UserForm()return render_to_response('register.html',{'uf':uf})... |
---|
(1)通过ifrequest.method == "POST":来判断当前状态是否为表单提交状态,如果不是,那么显示表单注册页面: uf = UserForm(),return render_to_response('register.html',{'uf':uf}),否则验证提交的表单信息:ifuf.is_valid():。
(2)判断如果表单提交正确,如果正确,获取提交的信息:username = (request.POST.get('username')).strip()和password =(request.POST.get('password')).strip()。
(3)通过user_list=User.objects.filter(username=username)的返回变量user_list是否为空来判断注册的用户名是否已经被注册过,如果未注册过那么提示错误信息,否则接受提交的注册信息,将其保存在数据库中...user.save()。
在这里特别需要注意的是,由于后面需要用到基于Requests的接口测试,所以这里必须使用request.POST.get('username')来获取表单数据。
模板文件为register.html,其内容为。
{%load staticfiles%}<!DOCTYPE html><html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --> <meta name="description" content=""> <meta name="author" content=""> <title>电子商务系统-注册</title> <!-- Bootstrap core CSS --> <link href="{%static 'css/signin.css'%}" rel="stylesheet"--> <!-- Custom styles for this template --> <link href="{%static 'css/bootstrap.min.css'%}" rel="stylesheet"--> <link href="{%static 'css/my.css'%}" rel="stylesheet"> </head> <body> <div> <form method="post" enctype="multipart/form-data"> <h2>电子商务系统-注册</h2> {{uf.as_p}} <p style="color:red">{{error}}</p><br> <button class="btn btn-lg btn-primary btn-block" type="submit">注册</button><br> <a href="/index/">登录</a> </form> </div><!-- /container --> </body></html> |
---|
其中。
(1){{error}}:显示的是错误提示信息。
(2){{uf.as_p}}:显示的是表单信息。
如图3-2所示。
图3-2 注册页面