项目截图
运行截图
1、建立路由
注意:login跟logout是django用户认证的内置函数,不要使用,不然会冲突报错
from user import views
app_name = 'user'
urlpatterns = [
path('', views.index, name="index"),
path('register/', views.register, name='register'),
path('login/', views.user_login, name='login'),
path('logout/', views.user_logout, name='logout'),
# 路由保护(登录后才能访问)
path('a/', views.a, name='a'),
# 修改密码
path('change_password', views.change_password, name='change_password'),
]
2、建立表单验证类forms.py,用来验证表单提交过来的数据,还有模型models.py
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# 这里要继承AbstractUser,使用人家的东西就要按照人家的来
class User(AbstractUser):
uid = models.AutoField(primary_key=True)
username = models.CharField(unique=True, max_length=30)
password = models.CharField(max_length=254)
class Meta:
db_table = 'user'
forms.py
from django import forms
# 表单验证类
class Form(forms.Form):
username = forms.CharField(max_length=16, required=True, error_messages={
'max_length': '用户名太长了(超过16给了)',
'required': '用户名不能为空'
})
password = forms.CharField(min_length=2, required=True, error_messages={
'min_length': '密码太短',
'required': '密码不能为空'
})
3、建立设图函数
from django.shortcuts import render, HttpResponse, redirect, reverse, HttpResponseRedirect
from django.contrib.auth import authenticate, login, logout # 查数据库验证, 登录, 退出登录
from django.contrib.auth.decorators import login_required # 路由保护装饰器
from user.models import User # 用户表
from user.forms import Form # 表单验证类(自定义的)
def register(request):
if request.method == 'POST':
form = Form(request.POST)
# 验证
if form.is_valid:
data = request.POST.dict()
username = data.get('username')
password = data.get('password')
# 写入数据库,create_user会做密码签名(加密)
try:
user = User.objects.create_user(username=username, password=password)
except:
# 插入数据库失败的其他原因
return render(request, 'register.html', {'content': '用户名已存在'})
if user:
return redirect('login.html')
else:
# 用户名已存在的情况
return render(request, 'register.html', {'content': '用户名已存在'})
return render(request, 'register.html')
# 登录,不要用login,会跟用户验证中的login冲突
def user_login(request):
if request.method == 'POST':
form = Form(request.POST)
# 验证
if form.is_valid:
data = request.POST.dict()
username = data.get('username')
password = data.get('password')
# 用户验证,如果用户名和密码正确,返回user对象,否则返回None
user = authenticate(request, username=username, password=password)
if user:
login(request, user) # 记住用户登录状态,将user赋值给request
# return redirect('/') # 重定向
# return redirect('user:index') # 重定向
return redirect(reverse('user:index')) # 重定向
# return HttpResponseRedirect('/') # 重定向
# return HttpResponseRedirect(reverse('user:index')) # 重定向 user:index
else:
return render(request, 'login.html', {'content': '用户名或密码错误'})
return render(request, 'login.html')
def user_logout(request):
logout(request)
return redirect(reverse('user:index'))
def index(request):
# 判断是否登录
if authenticate(request):
return render(request, 'index.html')
else:
return render(request, 'index.html')
# 未登录,跳转下面的路由
@login_required(login_url='user:login')
# @login_required(login_url='/login/')
def a(request):
return HttpResponse('<h1>后台<h1>')
# 修改密码
@login_required(login_url='user:login')
def change_password(request):
# print(request.user.username)
if request.method == 'POST':
# 用户验证,如果当前登录的用户名和表单输入的旧密码密码正确,则返回user对象,否则返回None
user = authenticate(request, username=request.user.username, password=request.POST.get('old_password'))
if user:
try:
if len(request.POST.get('new_password')) < 3: # 判断新密码是否符合规则
return render(request, 'change_password.html', {'content': '密码长度不能小于3位'})
user = User.objects.get(username=request.user.username) # 获取得用户实例对象
user.set_password(request.POST.get('new_password')) # 修改密码
user.save() # 保存
except:
return render(request, 'change_password.html', {'content': '出错了'})
# 无错误,则先退出登录状态,然后去到登录页面重新登录
logout(request)
return redirect('user:login')
else:
return render(request, 'change_password.html', {'content': '旧密码输入错误'})
# GET方法
return render(request, 'change_password.html')
templates文件夹
注册register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>注册</h1>
<form action="" method="post">
{% csrf_token %}
用户名:<input type="text" name="username">
密码: <input type="password" name="password">
<input type="submit">
</form>
</body>
</html>
登录login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录</h1>
<form action="" method="post">
{% csrf_token %}
用户名:<input type="text" name="username">
密码: <input type="password" name="password">
<input type="submit">
</form>
{{ content }}
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>主页</h1>
{% if request.user.is_authenticated %}
<p>欢迎---{{ request.user.username }}---<a href="{% url 'user:logout' %}">退出登录</a>-----<a href="{% url 'user:change_password' %}">修改密码</a></p>
{% else %}
<a href="{% url 'user:login' %}">去登录</a>
{% endif %}
</body>
</html>
修改密码change_password
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
旧密码:<input type="password" name="old_password">
新密码: <input type="password" name="new_password">
<input type="submit">
</form>
{{ content }}
</body>
</html>
django一整套就是这样了