点击登录密码错误

点击登录密码错误

from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth import authenticate, login, logout

from accounts.forms import UserLoginForm, UserRegistForm, UserAddressForm
from accounts.models import User, UserAddress
from utils import constants
from utils.verify import VerifyCode


def user_login(request):
   """ 用户登录 """
   # 如果登录是从其他页面跳转过来的,会带next参数,如果有next参数,登录完成后,需要调转到
   # next所对应的地址,否则,跳转到首页上去
   next_url = request.GET.get('next', 'index')
   # 第一次访问URL GET 展示表单,供用户输入
   # 第二次访问URL POST
   if request.method == 'POST':
       form = UserLoginForm(request=request, data=request.POST)
       print(request.POST)
       client = VerifyCode(request)
       code = request.POST.get('vcode', None)
       rest = client.validate_code(code)
       print('验证结果:', rest)
       # 表单是否通过了验证
       if form.is_valid():
           # 执行登录
           data = form.cleaned_data

           # ## 使用自定义的方式实现登录
           # # 查询用户信息 [MD5]加密算法,不可逆的加密算法 1243 -> sdfadfad
           # user = User.objects.get(username=data['username'], password=data['password'])
           # # 设置用户ID到session
           # request.session[constants.LOGIN_SESSION_ID] = user.id
           # # 登录后的跳转
           # return redirect('index')

           ### 使用django-auth来实现登录
           user = authenticate(request, username=data['username'], password=data['password'])
           if user is not None:
               login(request, user)
               # 登录后的跳转
               return redirect(next_url)
       else:
           print(form.errors)
   else:
       form = UserLoginForm(request)
   return render(request, 'login.html', {
       'form': form,
       'next_url': next_url
   })


def user_logout(request):
   """ 用户退出登录 """
   logout(request)
   return redirect('index')


def user_register(request):
   """  用户注册 """
   if request.method == 'POST':
       form = UserRegistForm(request=request, data=request.POST)
       if form.is_valid():
           # 调用注册方法
           form.register()
           return redirect('index')
       else:
           print(form.errors)
   else:
       form = UserRegistForm(request=request)
   return render(request, 'register.html', {
       'form': form
   })


@login_required
def address_list(request):
   """ 地址列表 """
   my_addr_list = UserAddress.objects.filter(user=request.user, is_valid=True)
   return render(request, 'address_list.html', {
       'my_addr_list': my_addr_list
   })


@login_required
def address_edit(request, pk):
   """ 地址新增或者是编辑 """
   user = request.user
   addr = None
   initial = {}
   # 如果PK是数字,则表示修改
   if pk.isdigit():
       # 查询相关的地址信息
       addr = get_object_or_404(UserAddress, pk=pk, user=user, is_valid=True)
       initial['region'] = addr.get_region_format()
   if request.method == 'POST':
       form = UserAddressForm(request=request, data=request.POST,
                              initial=initial, instance=addr)
       if form.is_valid():
           form.save()
           return redirect('accounts:address_list')
   else:
       form = UserAddressForm(request=request, instance=addr, initial=initial)
   return render(request, 'address_edit.html', {
       'form': form
   })


def address_delete(request, pk):
   """ 删除地址 """
   addr = get_object_or_404(UserAddress, pk=pk, is_valid=True, user=request.user)
   addr.is_valid = False
   addr.save()
   return HttpResponse('ok')


http://img1.sycdn.imooc.com//climg/5e4ff0c00946a0de08960152.jpg

http://img1.sycdn.imooc.com//climg/5e4ff0dd090fb80107060055.jpg



正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学,你好。

针对以上问题,提供以下排查思路:

首先:检查数据库中存储的用户信息与在Model中定义、存储、迁移的数据项是否一致;

其次:核对表单中UserLoginForm的定义和字段验证的相关代码,并对获取到的数据进行打印,如用户名、密码与数据库对应的数据相相比较,观察是否一致;

最后:重新定义一个用户,再一次按照视频中的操作顺序进行再次尝试;

若上述步骤仍未解决,请在问答区重新提问。

如果我的回答解决了您的疑惑,请采纳!祝~学习愉快~

提问者 我爱计算机shary 2020-02-21 23:05:23

import re

from django import forms
from django.contrib.auth import authenticate, login

from accounts.models import User, UserAddress
from utils.verify import VerifyCode


class UserLoginForm(forms.Form):
   """ 用户登录表单 """
   username = forms.CharField(label='用户名', max_length=64)
   password = forms.CharField(label='密码', max_length=64,
                              widget=forms.PasswordInput,
                              error_messages={
                                  'required': '请输入密码'
                              })
   verify_code = forms.CharField(label='验证码', max_length=4)

   def __init__(self, request, *args, **kwargs):
       super().__init__(*args, **kwargs)
       self.request = request

   #def clean_username(self):
      #""" 验证用户名 hook 钩子函数"""
       #username = self.cleaned_data['username']
       #print(username)
   #判断用户名是否为手机号码
        #pattern = r'^0{0,1}1[0-9]{10}$'
        #if not re.search(pattern, username):
            #raise forms.ValidationError('请输入正确的手机号码')
           #return username

   def clean_verify_code(self):
       """ 验证用户输入的验证码是否正确 """
       verify_code = self.cleaned_data['verify_code']
       if not verify_code:
           raise forms.ValidationError('请输入验证码')
       client = VerifyCode(self.request)
       if not client.validate_code(verify_code):
           raise forms.ValidationError('您输入的验证码不正确')
       return verify_code

   def clean(self):
       cleaned_data = super().clean()
       print(cleaned_data)
       # 获取用户名和密码 ,不建议使用[]的方式
       # username = cleaned_data['username']

       username = cleaned_data.get('username', None)
       password = cleaned_data.get('password', None)
       if username and password:
           # 查询用户名和密码匹配的用户
           user_list = User.objects.filter(username=username)
           if user_list.count() == 0:
               raise forms.ValidationError('用户名不存在')
           # # 验证密码是否正确
           # if not user_list.filter(password=password).exists():
           #     raise forms.ValidationError('密码错误')
           if not authenticate(username=username, password=password):
               raise forms.ValidationError('密码错误')
       return cleaned_data


class UserRegistForm(forms.Form):
   """ 用户注册表单 """
   username = forms.CharField(label='用户名', max_length=64)
   nickname = forms.CharField(label='昵称', max_length=64)
   password = forms.CharField(label='密码', max_length=64, widget=forms.PasswordInput)
   password_repeat = forms.CharField(label='重复密码', max_length=64, widget=forms.PasswordInput)
   verify_code = forms.CharField(label='验证码', max_length=4)

   def __init__(self, request, *args, **kwargs):
       super().__init__(*args, **kwargs)
       self.request = request

   def clean_username(self):
       """ 验证用户名是否已经被注册 """
       data = self.cleaned_data['username']
       if User.objects.filter(username=data).exists():
           raise forms.ValidationError('用户名已存在')
       return data

   def clean_verify_code(self):
       """ 验证用户输入的验证码是否正确 """
       verify_code = self.cleaned_data['verify_code']
       if not verify_code:
           raise forms.ValidationError('请输入验证码')
       client = VerifyCode(self.request)
       if not client.validate_code(verify_code):
           raise forms.ValidationError('您输入的验证码不正确')
       return verify_code

   def clean(self):
       cleaned_data = super().clean()
       password = cleaned_data.get('password', None)
       password_repeat = cleaned_data.get('password_repeat', None)
       if password and password_repeat:
           if password != password_repeat:
               raise forms.ValidationError('两次密码输入不一致')
       return cleaned_data

   def register(self):
       """ 注册方法 """
       data = self.cleaned_data
       # 1. 创建用户
       User.objects.create_user(username=data['username'],
                                password=data['password'],
                                level=0,
                                nickname='昵称')
       # 2. 自动登录
       user = authenticate(username=data['username'],
                    password=data['password'])
       login(self.request, user)
       return user


class UserAddressForm(forms.ModelForm):
   """" 地址新增|修改 """

   region = forms.CharField(label='大区域选项', max_length=64, required=True,
                            error_messages={
                                'required': '请选择地址'
                            })

   def __init__(self, request, *args, **kwargs):
       super().__init__(*args, **kwargs)
       self.request = request

   class Meta:
       model = UserAddress
       fields = ['address', 'username', 'phone', 'is_default']
       widgets = {
           'is_default': forms.CheckboxInput(attrs={
               'class': 'weui-switch'
           })
       }

   def clean_phone(self):
       """ 验证用户输入的手机号码 """
       phone = self.cleaned_data['phone']
       # 判断用户名是否为手机号码
       pattern = r'^0{0,1}1[0-9]{10}$'
       if not re.search(pattern, phone):
           raise forms.ValidationError('请输入正确的手机号码')
       return phone

   def clean(self):
       cleaned_data = super().clean()
       # 查询当前登录用户的地址数据
       addr_list = UserAddress.objects.filter(is_valid=True, user=self.request.user)
       if addr_list.count() >= 20:
           raise forms.ValidationError('最多只能添加20个地址')
       return cleaned_data

   def save(self, commit=True):
       obj = super().save(commit=False)
       region = self.cleaned_data['region']
       # 省市区的数据
       (province, city, area) = region.split(' ')
       obj.province = province
       obj.city = city
       obj.area = area
       obj.user = self.request.user

       # 修改的时候,如果已经有了默认地址,当前也勾选了默认地址选项
       # 需要把之前的地址都改为非默认的地址
       if self.cleaned_data['is_default']:
           UserAddress.objects.filter(is_valid=True, user=self.request.user,
                                      is_default=True).update(is_default=False)
       obj.save()

提问者 我爱计算机shary 2020-02-21 23:03:07

写123456也是错误

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.从网页搭建入门Python Web
  • 参与学习           人
  • 提交作业       218    份
  • 解答问题       3562    个

本阶段带你用Python开发一个网站,学习主流框架Django+Flask是Python Web开发的第一步,在基础知识上实现积分商城的项目开发,体验真实的项目开发流程,提高解决编程问题和效率的能力。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师