django项目-电商平台(2)-用户模块

用户模块概述

用户模块主要为用户的模型类,用户的信息,用户的登录与注册,登录验证,用户中心视图几部分

1. 建立模型类

class User(models.Model):
    uname = models.CharField(max_length=20)
    upwd = models.CharField(max_length=40)
    uemil = models.CharField(max_length=30)
    urelname =models.CharField(max_length=20,default='')
    uadr = models.CharField(max_length=100,default='')
    uphone = models.CharField(max_length=11,default='')

建立模型后要进行数据库迁移

2. 建立视图函数,在view.py里建

  1. 首先是登录和注册的视图函数
def login(request):

    uname = request.COOKIES.get('uname','')

    pwd = request.COOKIES.get('upwd','')
#用来获取cookie里的用户名和密码,实现自动填写信息
    context = {'uname': uname,
               'pwd': pwd,
               'error': 0}
    try:
        url = request.META['HTTP_REFERER']
        #获取头部的 来源地址
    except:url = '/'
    response = render(request, 'df_user/login.html', context)
    #将请求的url存入cookie,然后登陆后跳回原来的地方
    # render方法返回httpesponse方法
    response.set_cookie('url', url)
    # 在esponse里写入cookie
    return response
    
def register(request):
    return render(request, 'df_user/register.html')
  1. 登录和注册的处理函数
    用来处理登录和注册的表单提交 ,以及数据的存取数据库操作,还有向cookie的写入操作

def login_handle(request):
    # 接收表单数据
    post = request.POST
    uname = post.get('username')
    upwd1 = post.get('pwd')
    # 设置默认值
    remember = post.get('remember', '0')

    # 加密
    s1 = sha1()#创建sha1对象
    s1.update(upwd1.encode('utf8'))#要先编码
    upwd = s1.hexdigest()
    # 验证用户是否正确
    user = User.objects.filter(uname=uname).filter(upwd=upwd).first();

    if user:

        url = request.COOKIES.get('url', '/')  # 第二个参数为默认参数,如果url没有,则条首页
        red = HttpResponseRedirect(url)
        # 如果记住密码则将用户名和密码写入cookies
        if remember == '1':

            red.set_cookie('uname', user.uname)
            red.set_cookie('upwd', upwd1)

        else:
            red.set_cookie('uname', '',max_age=-1)
            red.set_cookie('upwd', '',max_age=-1)
            #也应该写入session,会安全一点
            # request.COOKIES['userinfo']=[user.uname,user.upwd]
            #将uname和id写入session用来保持登录状态
        request.session['username'] = uname
        request.session['uid'] = user.id
        return red

    else:
        #如果没有用户,怎返回错误参数,模板界面,根据错误信息给出提示
        context = {'error': 1,
                   'uname': uname}
        return render(request, 'df_user/login.html', context)
    
        
        
def register_handle(request):
    # 接收用户输入
    post = request.POST
    uname = post.get('user_name')
    pwd = post.get('pwd')
    cpwd = post.get('cpwd')
    uemail = post.get('email')
    # allow = post.get('allow')
    # 判断密码是否相等
    if pwd != cpwd:
        return redirect('/user/register')
    # 密码加密
    # 使用sha1加密
    s1 = sha1()
    # sha1加密前,要先编码为比特
    s1.update(pwd.encode('utf8'))
    pwd = s1.hexdigest()
    # 存入数据库
    user = User()
    user.uname = uname
    user.upwd = pwd
    user.uemil = uemail
    user.save()
    print(user.uname)
    return redirect('/user/login')
  1. 在注册的时候需要验证,,用户名是否存在,这里用ajax发送异步请求来判断是否存在相同用户名
js部分
function check_user_name(){
        var len = $('#user_name').val().length;

        if(len<5||len>20)
        {
            $('#user_name').next().html('请输入5-20个字符的用户名')
            $('#user_name').next().show();
            error_name = true;
        }
        else
            // 发送ajax请求,检查用户名是存在
        // {    alert('准备发送请求');
            $.get('/user/register_exist?uname='+$('#user_name').val(),function (data) {
            // alert('count'+data.count);
            if(data.count!=0){
                $('#user_name').next().html('用户名已经存在');
                //显示错误信息
                $('#user_name').next().show();
                error_name = true;
            }else {
                $('#user_name').next().hide();
            error_name = false;}


        })

        }
    ;

处理函数

def register_exist(request):
    uname = request.GET.get('uname')  # 通过url传参的方式
    count = User.objects.filter(uname=uname).count()
    # print(count)
    # 返回json字典,判断是存在,
    return JsonResponse({'count': count})
  1. 注销
def logout(request):
    request.session.flush()  # 清空所有session
    return redirect('/')
  1. 登录验证,很多页面如个人中心,购物车等都需要在进入视图前进行用户是否登录的验证,这正符合 装饰器 的用法,用装饰器完成登录验证
def login(func):
    def login_fun(request,*args,**kwargs):
        if request.session.has_key('username'):
            #如果成功登录,继续执行 原函数
            return func(request,*args,**kwargs)
        else:
            red = HttpResponseRedirect('/user/login')
            #将当前页的url存入cookie

            red.set_cookie('url',request.get_full_path())

            return red
    return login_fun
    
    
    
    
    
    
    
    
    
    使用时只需要在视图函数前加上装饰器即可,方便
@user_decorator.login
def user_center_info(request):
    pass
  1. 个人信息中心,用来展示自己的信息
@user_decorator.login  #用验证装饰器
def user_center_info(request):
    username = request.session.get('username')
    user = User.objects.filter(uname=username).first()

    #获取最近浏览的商品
    goodids = request.COOKIES.get('goodids','')#获得 cookie存的记录
    if goodids != '':
        goodidsl = goodids.split(',')#拆分为列表

        #这样查询可以的到所需商品,但顺序无法维护,无法为原先设定顺序
        # GoodInfo.objects.filter(id__in=goodids)
        goods_list = []#用来存放 商品列表,并维持顺序不变
        for good_id in goodidsl:
            goods = GoodInfo.objects.filter(pk=good_id).first()
            goods_list.append(goods)
    else:
        goods_list = []

#其实可以直接传user对象
    context = {'title': '用户中心', 'username': username, 'phone': user.uphone, 'adress': user.uadr,
                'good_list':goods_list,'tag':1}  #tag用来标记 高亮页
    return render(request, 'df_user/user_center_info.html', context)
    

8.个人信息的收货地址页,显示地址信息和修改信息

def user_center_site(request):
    username = request.session.get('username')
    user = User.objects.filter(uname=username).first()
    if request.method == 'POST':  #当post的时候修改数据
        adr = request.POST.get('area')
        username = request.POST.get('user')
        phone = request.POST.get('phone')
        user.uadr = adr
        user.uphone =phone
        user.urelname = username
        user.save()
    context = {'adr':user.uadr,
               'user':user.urelname,
               'phone':user.uphone,
               'tag':3}
    return render(request,'df_user/user_center_site.html',context)

还有一个个人的订单页面,在订单模块讲

3. 在模板里建立相应的模板,并填充数据

4. 配置相应的url

在user应用下建立urls.py文件,然后在主目录下的urls里这样配置

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^user/', include('df_user.urls',namespace='user')),
    url(r'^', include('df_goods.urls',namespace='goods')),
    url(r'^cart/',include('df_cart.urls')),
    url(r'^order/',include('df_order.urls')),
    url(r'^search/', include('haystack.urls')),
]

然后在对应的应用下的urls里配置`

from django.conf.urls import url
from . import views
urlpatterns =[
    url(r'^register$',views.register),
    url(r'^register_handle$',views.register_handle),
    url(r'^login$',views.login),
    url(r'^login_handle$',views.login_handle),
    url(r'^user_center_info$',views.user_center_info),
    url(r'^user_center_site$',views.user_center_site),
    url(r'^user_center_order/(\d+)$',views.user_center_order),
    url(r'^logout$',views.logout),
    url(r'^register_exist$',views.register_exist),

]

到这里用户模块基本完成了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容