{{ v.name }}
{{ v.cls }}类
{{ v.price }} ¥{{ v.price }}
类似于用户登陆,同样在users.views.py中添加registerview(view)类,其中对表单的get和post作出处理。如果是get方法,重新返回register页面让用户进行填写。
defget(self,request):register_form=registerform()returnrender(request,"register.html",{'register_form':register_form})123
method=post时,用户注册逻辑:
defpost(self,request):#实例化form,验证每个字段是否合法register_form=registerform(request.post)pre_check=register_form.is_valid()ifpre_check:#取出email和passworduser_name=request.post.get("email","")pass_word=request.post.get("password","")#实例化用户,然后赋值user_profile=userprofile()user_profile.username=user_nameuser_profile.email=user_name#新建用户为非活跃用户,可通过验证变为活跃用户user_profile.is_active=false#将明文转换为密文赋给passworduser_profile.password=make_password(pass_word)user_profile.save()#保存到数据库#此处加入了邮箱验证的手段send_register_email(user_name,"register")returnrender(request,"login.html")else:#form表单验证失败,将错误信息传给前端returnrender(request,"register.html",{"register_form":register_form})1234567891011121314151617181920212223
在form.py中添加registerform类对给出表单处理类:
classregisterform(forms.form):#不能为空email=forms.emailfield(required=true)password=forms.charfield(required=true,min_length=6,max_length=20)#出错信息captcha=captchafield(error_messages={"invalid":u"验证码错误"})123456
以下为对应的前端代码,其中添加了了django的模版用法,均以{%%}的形式在html中加入逻辑,避免了python代码的直接插入,方便维护和修改。
{%csrf_token%}是django为了在用户提交表单时防止跨站攻击所做的保护,在表单最后没有加入的话,不能正常提交表单中有一项为验证码,在django中可以使用django-simple-captcha模块实现:
在users.py中添加了邮箱验证的model:
classemailverifyrecord(models.model):#验证码code=models.charfield(max_length=20,verbose_name=u"验证码")email=models.emailfield(max_length=50,verbose_name=u"邮箱")#包含注册验证和找回验证send_type=models.charfield(verbose_name=u"验证码类型",max_length=10,choices=(("register",u"注册"),("forget",u"找回密码")))send_time=models.datetimefield(verbose_name=u"发送时间",default=datetime.now)classmeta:verbose_name=u"邮箱验证码"verbose_name_plural=verbose_namedef__unicode__(self):return'{0}({1})'.format(self.code,self.email)123456789101112
在setting.py中添加配置邮箱信息:
email_host="smtp.163.com"#服务器email_port=25#一般情况下都为25email_host_user="abc@163.com"#账号email_host_password="password"#密码email_use_tls=false#一般都为falseemail_from="abc@163.com"#邮箱来自1234567
创建utils包,新建email_send.py
fromrandomimportrandom#用于生成随机码fromdjango.core.mailimportsend_mail#发送邮件模块fromusers.modelsimportemailverifyrecord#邮箱验证modelfrommxonline.settingsimportemail_from#setting.py添加的的配置信息#生成随机字符串defrandom_str(randomlength=8):str=''chars='aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz0123456789'length=len(chars)-1random=random()foriinrange(randomlength):str+=chars[random.randint(0,length)]returnstrdefsend_register_email(email,send_type="register"):email_record=emailverifyrecord()#将给用户发的信息保存在数据库中code=random_str(16)email_record.code=codeemail_record.email=emailemail_record.send_type=send_typeemail_record.save()#初始化为空email_title=""email_body=""#如果为注册类型ifsend_type=="register":email_title="注册激活链接"email_body="请点击下面的链接激活你的账号:http://127.0.0.1:8000/active/{0}".format(code)#发送邮件send_status=send_mail(email_title,email_body,email_from,[email])ifsend_status:pass1234567891011121314151617181920212223242526272829303132333435
然后将用户变为活跃用户,加入相关的view:
classactiveuserview(view):defget(self,request,active_code):#用code在数据库中过滤处信息all_records=emailverifyrecord.objects.filter(code=active_code)ifall_records:forrecordinall_records:email=record.email#通过邮箱查找到对应的用户user=userprofile.objects.get(email=email)#激活用户user.is_active=trueuser.save()else:returnrender(request,"active_fail.html")returnrender(request,"login.html")123456789101112131415
配置生成页面的url:
url(r'^active/(?p
至此,便可将is_active加入到登陆的限制当中: