Django用户扩展

2017-05-01  本文已影响61人  syp_xp

本文转自http://blog.csdn.net/clh604/article/details/9269449
另外可以参考 http://www.cnblogs.com/caseast/p/5909987.html

  1. 用户登录:
    首先假设有这样的登录界面:



    处理登录的视图代码如下:

def userLogin(request):  
    curtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime());  
          
    if request.method=='POST':  
        print("POST")  
        username=request.POST.get('name','')  
        password=request.POST.get('password','')  
        user= auth.authenticate(username=username,password=password)#a***********  
        if user and user.is_active:  
            auth.login(request, user)#b************  
            return HttpResponseRedirect("/user")  
                
    return render_to_response("blog/userlogin.html",RequestContext(request,{'curtime':curtime}))   

注:

  1. 用户注销
    注销比较简单,只需要在session中删除对应的user信息就ok了
def userLogout(request):  
    auth.logout(request)  
    return HttpResponseRedirect('/user')  
  1. 用户注册
    注册的界面如下:



    用户名、密码、邮箱是基本的注册信息,这是django自带的,下面的电话是扩展的用户信息,至于这么扩展用户信息,一会会讲,先透露下我采用的是profile的扩展方式(个人喜好吧,我觉得这种方式简单明了)
    注册的视图view代码:

def userRegister(request):  
    curtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime());  
      
    if request.user.is_authenticated():#a*******************  
        return HttpResponseRedirect("/user")  
    try:  
        if request.method=='POST':  
            username=request.POST.get('name','')  
            password1=request.POST.get('password1','')  
            password2=request.POST.get('password2','')  
            email=request.POST.get('email','')  
            phone=request.POST.get('phone','')  
            errors=[]  
              
            registerForm=RegisterForm({'username':username,'password1':password1,'password2':password2,'email':email})#b********  
            if not registerForm.is_valid():  
                errors.extend(registerForm.errors.values())  
                return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime,'username':username,'email':email,'errors':errors}))  
            if password1!=password2:  
                errors.append("两次输入的密码不一致!")  
                return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime,'username':username,'email':email,'errors':errors}))  
                  
            filterResult=User.objects.filter(username=username)#c************  
            if len(filterResult)>0:  
                errors.append("用户名已存在")  
                return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime,'username':username,'email':email,'errors':errors}))  
              
            user=User()#d************************  
            user.username=username  
            user.set_password(password1)  
            user.email=email  
            user.save()  
            #用户扩展信息 profile  
            profile=UserProfile()#e*************************  
            profile.user_id=user.id  
            profile.phone=phone  
            profile.save()  
            #登录前需要先验证  
            newUser=auth.authenticate(username=username,password=password1)#f***************  
            if newUser is not None:  
                auth.login(request, newUser)#g*******************  
                return HttpResponseRedirect("/user")  
    except Exception,e:  
        errors.append(str(e))  
        return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime,'username':username,'email':email,'errors':errors}))  
      
    return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime}))  

注:
a、验证用户是否登录了,已经登录就没必要注册了(当然这只是练习使用,实际生产情况可能不一样)
b、注册表单传过来的数据需要一些基本的验证,怎么验证表单数据可以参考这个教程:http://djangobook.py3k.cn/2.0/chapter07/
c、用User模型查找要注册的用户名是否存在,如果用户已经存在就需要提示注册的客户更换用户名
d、直接利用User模型把通过验证的用户数据存入数据库,需要注意的是,保存密码信息时需要使用set_password方法(因为这里有个加密的过程)
e、存储用户的扩展信息(这里是用户的电话号码),这里用到自定义的用户扩展模型UserProfile,具体怎么扩展用户后面会讲
f、用户登录前需要先进行验证,要不然会出错
g、用户登录

  1. 用户扩展
    网上关于django的用户扩展方式有好几种,个人比较倾向于Profile的方式,主要是这种方式简单清楚,扩展步骤如下:
    A、在你App的models中新建一个UserProfile模型
from django.contrib.auth.models import User        
class UserProfile(models.Model):  
    user=models.OneToOneField(User,unique=True,verbose_name=('用户'))#a******  
    phone=models.CharField(max_length=20)#b******  

注:

user=User()  
user.username=username  
user.set_password(password1)  
user.email=email  
user.save()  
#用户扩展信息 profile  
profile=UserProfile()  
profile.user_id=user.id  
profile.phone=phone  
profile.save()  
class UserProfileInline(admin.StackedInline):  
    model=UserProfile  
    fk_name='user'  
    max_num=1    
class UserProfileAdmin(UserAdmin):  
    inlines = [UserProfileInline, ]  
admin.site.unregister(User)  
admin.site.register(User,UserProfileAdmin)  

这是我学习django时的一些经验,也许不全对,仅供参考

上一篇下一篇

猜你喜欢

热点阅读