1、定义模板
在templates文件夹下边新建register.html,代码如下:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<!--{%是模板标签,
其作用是解析视图函数对应的URL模式。
auth_app对应的是此应用的urls.py中的app_name的值,即应用的命名空间
register对应的是urls.py是某个url模式的别名-->
<form action="{% url 'auth_app:register' %}" method="POST">
{% csrf_token %}
<div style="margin:0 auto;width: 500px">
<table>
<tr style="text-align: left">
<td><label>用户名</label></td>
<td><input type="text" name="username"></td>
</tr>
<tr style="text-align: left">
<td><label>密码</label></td>
<td><input type="password" name="password"></td>
</tr>
<tr style="text-align: left">
<td><label>确认密码</label></td>
<td><input type="password" name="check_password"></td>
</tr>
</table>
<div style="margin:0 auto;width: 300px">
<!--{% 为模板标签,一般用于文本输出或流程控制-->
{% if state %}
<!-- {{是模板变量,其值由视图函数传递过来-->
<p style="color: red">{{ state }}</p>
{% endif %}
</div>
<button type="submit">注册</button>
</div>
</form>
</body>
</html>
2、定义对应的视图类
在auth_app/views.py文件中定义处理用户注册请求的视图类RegisterView(),分别处理浏览器发起的GET请求和POST请求。
auth_app/views.py
完整代码如下:
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View
from django.contrib.auth import authenticate, login, logout
# 注册
class RegisterView(View):
"""此视图类用于响应http://127.0.0.1:8000/register的GET与POST请求"""
def get(self, request):
"""处理GET请求"""
state = request.GET.get('state', '')
print('GET请求 state=', state)
return render(request, 'register.html', {'state': state})
def post(self, request):
"""处理POST请求"""
# 1、接收请求参数,用户名、密码和确认密码
username = request.POST.get('username', '')
password = request.POST.get('password', '')
check_password = request.POST.get('check_password', '')
# 2、校验请求参数
# 判断两次密码是否一致
if password != check_password:
state = '两次密码输入不一致,请重新输入!'
return render(request, 'register.html', {'state': state})
username_exists = User.objects.filter(username=username).exists()
# 判断用户名是否已被注册
if username_exists:
state = '该用户名已被注册,请登录!'
else:
# 执行注册
user = User.objects.create_user(username=username, password=password)
# 3、保存注册数据
user.save()
state = '注册成功,请登录!'
# 4、返回注册结果,在第10次课有登录页面时使用
# return redirect(reverse('auth_app:login') + '?state={}'.format(state))
# 注册时的重定向,第9次课使用
return redirect(reverse('auth_app:register') + '?state={}'.format(state))
- 处理get请求。当后端接收到用户通过浏览器发起的get请求后,调用RegisterView()里的get()方法处理GET请求,并返回register.html页面。
- 注册数据通过前端校验之后,用户单击注册按钮,浏览器会向后端发送POST请求,Django接收注册页面发来的POST请求,调用RegisterView类中的post()方法处理该请求。post()方法对POST请求的处理可以分为4步:接受请求参数,校验请求参数、保存注册数据、返回注册结果。
3、配置路由
根路由urls.py中:
path('', include('auth_app.urls'))
子路由baicai/auth_app/urls.py中:
from django.urls import path
from . import views
app_name ='auth_app'
urlpatterns = [
path('register/', views.RegisterView.as_view(), name='register'),
]
python manage.py runserver运行项目
浏览器访问http://127.0.0.1:8000/register,输入用户名,密码以及确认密码,点击注册可进行注册。
刷新navicat里的goods数据库auth_user表,可以看到新创建的用户。