点击登录密码错误
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')


正在回答
同学,你好。
针对以上问题,提供以下排查思路:
首先:检查数据库中存储的用户信息与在Model中定义、存储、迁移的数据项是否一致;
其次:核对表单中UserLoginForm的定义和字段验证的相关代码,并对获取到的数据进行打印,如用户名、密码与数据库对应的数据相相比较,观察是否一致;
最后:重新定义一个用户,再一次按照视频中的操作顺序进行再次尝试;
若上述步骤仍未解决,请在问答区重新提问。
如果我的回答解决了您的疑惑,请采纳!祝~学习愉快~
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()
写123456也是错误
- 参与学习 人
- 提交作业 218 份
- 解答问题 3562 个
本阶段带你用Python开发一个网站,学习主流框架Django+Flask是Python Web开发的第一步,在基础知识上实现积分商城的项目开发,体验真实的项目开发流程,提高解决编程问题和效率的能力。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星