博客信息

Python Django 模板层(表单类、表单校验)

发布时间:『 2019-08-23 22:06』  博客类别:Python  阅读(690)

学生登录

 

概述

表单既可以在模板页面利用HTML编写,也可以使用Django提供的表单类编写。

 

相关属性参考官网:https://docs.djangoproject.com/en/1.11/ref/forms/fields/

 

实现熟悉的用户登录功能

 

1. 创建新应用account

2. settings中添加应用

3. 配置URL

4. account应用中创建forms.py文件

5. 编写views函数

6. 创建模板页面

7. 启动服务器运行程序

 

配置URL

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^account/',include('account.urls',namespace='account',app_name='account'))
]


#coding=utf-8


from django.conf.urls import url
import views

urlpatterns=[
    url(r'^login/$',views.login_view,name='login')
]


#coding=utf-8


from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(label=u'用户名')
    password = forms.CharField(label=u'密码',widget=forms.PasswordInput)


Views.py

# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.shortcuts import render
from .forms import LoginForm
from django.contrib.auth import authenticate,login



# Create your views here.
def login_view(request):
    if request.method=='GET':
        login_form = LoginForm()
        return render(request,'login.html',{'login_form':login_form})

    else:
        login_form= LoginForm(request.POST)


        #校验表单数据是否合法
        if login_form.is_valid():
            #以字典形式返回合法数据
            cd = login_form.cleaned_data
            print cd
            #检验用户输入的用户和密码是否正确
            user = authenticate(username=cd['username'],password=cd['password'])
            print user

            if user:
                #实现用户登录,将用户信息保存到session中完成登录操作
                login(request,user)
                return HttpResponse('success')

        return HttpResponse('failed')


前端页

 小李飞刀_Python



小李飞刀_Python


学生注册

 

应用场景

1. 查询时表单类只需要继承于forms.Form

2. 增删改时表单类需要继承于forms.ModelForm

 

创建模型类

class Clazz(models.Model):
    cno = models.AutoField(primary_key=True)
    cname = models.CharField(max_length=20)

    def __unicode__(self):
        return u'Clazz:%s'%self.cname
    

class Stu(models.Model):
    sno = models.AutoField(primary_key=True)
    sname = models.CharField(max_length=30)
    clazz = models.ForeignKey(Clazz,on_delete=models.CASCADE)

    def __unicode__(self):
        return u'Stu:%s,%s'%(self.sno,self.sname)

 

创建表单类(应用包下创建forms.py)

class Add_Clazz(forms.ModelForm):
    class Meta:
        model = Clazz
        #元组形式
        fields = ('cname',)


class Add_Stu(forms.ModelForm):
    class Meta:
        model = Stu
        fields = ('sname',)

 

配置URL

urlpatterns = [
    url(r'^login/$', views.login_view, name='login'),
    url(r'^register/$', views.register)
]

 

Views.py

# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.shortcuts import render
from .forms import *
from django.contrib.auth import authenticate,login



# Create your views here.
def login_view(request):
    if request.method=='GET':
        login_form = LoginForm()
        return render(request,'login.html',{'login_form':login_form})

    else:
        login_form= LoginForm(request.POST)


        #校验表单数据是否合法
        if login_form.is_valid():
            #以字典形式返回合法数据
            cd = login_form.cleaned_data
            print cd
            #检验用户输入的用户和密码是否正确
            user = authenticate(username=cd['username'],password=cd['password'])
            print user

            if user:
                #实现用户登录,将用户信息保存到session中完成登录操作
                login(request,user)
                return HttpResponse('success')

        return HttpResponse('failed')


def register(request):
    if request.method == 'POST':
        ac = Add_Clazz(request.POST)
        astu = Add_Stu(request.POST)

        if ac.is_valid() * astu.is_valid():
            new_clazz = ac.save()
            new_stu = astu.save(commit=False)
            new_stu.clazz = new_clazz
            new_stu.save()
            return HttpResponse('successfully')
        else:
            return HttpResponse('sorry,you can not register.')
    else:
        ac = Add_Clazz()
        astu = Add_Stu()
        return render(request, 'register.html', {'ac': ac, 'astu': astu})


前端页面

小李飞刀_Python

 

浏览器输入

http://127.0.0.1:8000/account/register/

测试结果数据库中新增了两条数据

 

表单校验

 

相关代码

urlpatterns = [
    url(r'^login/$', views.login_view, name='login'),
    url(r'^register/$', views.register),
    url(r'^register_validate/$', views.register_validate)
]

 

Forms.py

class Add_Clazz(forms.ModelForm):
    class Meta:
        model = Clazz
        fields = ('cname',)


class Add_Stu(forms.ModelForm):
    password = forms.CharField(max_length=30,widget=forms.PasswordInput)
    password2 = forms.CharField(max_length=30,widget=forms.PasswordInput)


    class Meta:
        model = Stu
        fields = ('sname',)

    def clean_password2(self):
        cd = self.cleaned_data
        if cd['password']!=cd['password2']:
            self.errors['password2'] = ['密码不一致']

            # raise forms.ValidationError('密码不一致!')
        return cd['password2']


Views.py

# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.shortcuts import render
from .forms import *
from django.contrib.auth import authenticate,login



# Create your views here.
def login_view(request):
    if request.method=='GET':
        login_form = LoginForm()
        return render(request,'login.html',{'login_form':login_form})

    else:
        login_form= LoginForm(request.POST)


        #校验表单数据是否合法
        if login_form.is_valid():
            #以字典形式返回合法数据
            cd = login_form.cleaned_data
            print cd
            #检验用户输入的用户和密码是否正确
            user = authenticate(username=cd['username'],password=cd['password'])
            print user

            if user:
                #实现用户登录,将用户信息保存到session中完成登录操作
                login(request,user)
                return HttpResponse('success')

        return HttpResponse('failed')


def register(request):
    if request.method == 'POST':
        ac = Add_Clazz(request.POST)
        astu = Add_Stu(request.POST)

        if ac.is_valid() * astu.is_valid():
            new_clazz = ac.save()
            new_stu = astu.save(commit=False)
            new_stu.clazz = new_clazz
            new_stu.save()
            return HttpResponse('successfully')
        else:
            return HttpResponse('sorry,you can not register.')
    else:
        ac = Add_Clazz()
        astu = Add_Stu()
        return render(request, 'register.html', {'ac': ac, 'astu': astu})


def register_validate(request):
    if request.method == 'POST':
        ac = Add_Clazz(request.POST)
        astu = Add_Stu(request.POST)

        if ac.is_valid() * astu.is_valid():
            try:
                new_clazz = Clazz.objects.get(cname=ac.cleaned_data['cname'])
            except Clazz.DoesNotExist:
                # 保存数据到数据库
                new_clazz = ac.save()
            # 保存数据对象不提交数据库
            new_stu = astu.save(commit=False)
            new_stu.clazz = new_clazz
            new_stu.password = astu.clean_password2()
            new_stu.save()
            return HttpResponse('successfully')
        else:
            return render(request, 'register_validate.html', {'ac': ac, 'astu': astu})
    else:
        ac = Add_Clazz()
        astu = Add_Stu()
        return render(request, 'register_validate.html', {'ac': ac, 'astu': astu})

 

前端页

小李飞刀_Python


 

浏览器输入

http://127.0.0.1:8000/account/register_validate/

测试结果数据库中新增了两条数据

小李飞刀_Python


over......


关键字:     Python       Django  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有