python 学习35

django 03

将我们上节编写的注册页面输入的用户名和密码保存到数据库中。

1.首先在templates中的user文件夹中再写一个注册成功的欢迎页面--welcome.html




    
    Title


    

注册成功 欢迎访问本页面

2.from表单提交分为get提交post提交,我们在注册页面进行的操作需区分是get还是post,而我们提交用户名和密码的时候为post提交,所以我们需要更改user文件夹中的register.html




    
    Title


{% csrf_token %}

用户名:

密码:

注意:我们需要在其中加一个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 }}

,并且在用户名的value中添加value='{{ bloguser.userName }}'

现在如果创建了重复用户名,会显示这样一个页面

python 学习35_第1张图片


你可能感兴趣的:(日记)