django 03
将我们上节编写的注册页面输入的用户名和密码保存到数据库中。
1.首先在templates中的user文件夹中再写一个注册成功的欢迎页面--welcome.html
Title
注册成功 欢迎访问本页面
2.from表单提交分为get提交和post提交,我们在注册页面进行的操作需区分是get还是post,而我们提交用户名和密码的时候为post提交,所以我们需要更改user文件夹中的register.html
Title
注意:我们需要在其中加一个key:{% csrf_token %} 用来作为表单标识
action 属性规定当提交表单时,向何处发送表单数据。
3.现在我们需要在views中register方法中做一个区分,区分from表单提交的是get请求还是post请求
from django.shortcuts import render,reverse,redirect
# Create your views here.
def register(request): #用来处理用户请求注册的命令
#做一个区分 是get请求还是post请求
if request.method =='GET':
return render(request,'user/register.html',{})
elif request.method =='POST':
return render(request, 'user/welcome.html',{})
这时我们提交之后会成功welcome页面中,但是此时创建的用户名和密码并没有存入到数据库中。
4.继续在views中的register方法中写
from django.shortcuts import render,reverse,redirect
# Create your views here.
from blog_user.models import BlogUser
def register(request): #用来处理用户请求注册的命令
#做一个区分 是get请求还是post请求
if request.method =='GET':
return render(request,'user/register.html',{})
elif request.method =='POST':
#创建一个用户/数据库表 对象 模型
bloguser=BlogUser()
bloguser.userName= request.POST.get('username')
bloguser.passWord=request.POST.get('upwd')
bloguser.save()#执行数据库保存
return render(request, 'user/welcome.html', {})
从models中引入类BlogUser,创建一个对象bloguser获取提交的用户名和密码,然后执行数据库保存。这时我们创建的用户名和密码将保存到数据库的表中。
5.接着我们使welcome页面美观一些,可以显示创建用户名的欢迎
在register方法中的elif 的return中的大括号中{'bloguser':bloguser} 注意大括号中为字典
在user文件夹中welcome中注册成功,欢迎{{ bloguser.userName }}登录
6.web开发中,页面响应方式(服务器向客户端响应内容)有2种方式:转发;重定向
1).转发 在服务器内部共享同一次请求资源 并且把内部资源隐式响应给客户端
2).重定向 重新指向一个新地址,同一次请求不共享,刷新并不会重复提交
我们在刷新页面welcome时,会重复提交数据到数据库中,为了避免这种情况的发生,我们需要在提交时使用重定向。
首先我们在views中引入from blog_user.models import BlogUser
接着我们改写register方法中elif的return
return redirect(reverse('user:welcome',args=[bloguser.id]))
然后在views中再写一个方法welcome:
def welcome(request,id):
#根据请求带参的id 获取数据库的信息
bloguser=BlogUser.objects.get(pk=id)
return render(request, 'user/welcome.html', {'bloguser':bloguser})
注意,这个方法需传入id这个参数
最后在bloguser中的urls中新增
#usr/bin/python
#-*-coding:utf-8-*-
from django.urls import path
from blog_user import views
app_name='user'
urlpatterns = [
path('register',views.register ),
path('welcome//',views.welcome,name='welcome')
]
这样刷新welcome页面就不会重复提交数据。
7.虽然现在不会重复提交数据,但是任然可以创建相同的用户名,首先我们需要修改数据库模型,在userName处添加唯一键
from django.db import models
# Create your models here.
class BlogUser(models.Model):
userName=models.CharField(max_length=20,unique=True)
passWord=models.CharField(max_length=20)
然后我们需要更新数据库模型,运行manger.py执行如下3条命令
makemigrations blog_user
sqlmigrate blog_user (创建的第二个文件,这里是0002)0002
migrate blog_user 0002
需注意:更新数据库模型时必须确保数据库没有重复数据,如有,删除后再更新。
这时我们如果在register网页中创建了重复的用户,会报错,现在我们需要处理这个异常,在views中
from django.shortcuts import render,reverse,redirect
# Create your views here.
from blog_user.models import BlogUser
def register(request): #用来处理用户请求注册的命令
#做一个区分 是get请求还是post请求
if request.method =='GET':
return render(request,'user/register.html',{})
elif request.method =='POST':
#创建一个用户/数据库表 对象 模型
bloguser=BlogUser()
bloguser.userName= request.POST.get('username')
bloguser.passWord=request.POST.get('upwd')
try:
bloguser.save()#执行数据库保存
#重定向
return redirect(reverse('user:welcome',args=[bloguser.id]))
except:
return render(request, 'user/register.html', {'bloguser':bloguser,'error':'用户名已创建'})
在执行数据库保存前后添加try -expect ,如果没有报错,则继续执行重定向,如果捕获到异常,则返回到注册页面并返回一个错误error,这时我们需在注册页面写入这个错误
在register的body中新增一个 {{ error }}
现在如果创建了重复用户名,会显示这样一个页面