Django之form表单认证

Model常用操作:   - 参数:filter  三种传参方式   - all(得到的是列表),values(字典),values_list(元祖)

[obj(id,name,pwd,email),obj(id,name,pwd,email),]      models.UserInfo.objects.all() #取到所有的值

[obj(id,name,email)] # pwd未取值      data_list = models.UserInfo.objects.all().only(‘name‘,‘email‘) #通过only可以取到里面指定的数据

for item in data_list:         item.id         item.name

[obj(id,pwd)] # pwd未取值      data_list = models.UserInfo.objects.all().defer(‘name‘,‘email‘)#这是不要取到这个字段

for item in data_list:         item.id         item.pwd  #如果only里没有这个字段可以.到但是最好不要这样取值因为是重新取值一次
路由系统:

反向生成URL:( url 三种方式)      /index/     func    name=a1         {% url "a1"}#这个放在HTML页面         reverse(‘x‘)# 这个放到views函数里面

/index/(\d+)/     func    name=a2         {% url "a2" 11 %}         reverse(‘x‘,args=(11,))

/index/(?P<nid>\d+)/     func    name=a3         {% url "a2" nid=11 %}         reverse(‘x‘,kwargs={‘nid‘:11})

这是url反向解析的另一种形式:

Django生命周期:   - wsgi      - wsgiref      - uwsgi

Http请求本质:   a1=123&a2=456    如果POST方法发送数据,数据放在url里面也可以取到

{a1:13}   
1. 数据库设计   - 属性相同归类到一张表中   - 连表有性能消耗      - 连表设计:         class UserType(models.Model):            """            用户类型表,个数经常变动            """            title = models.CharField(max_length=32)

class UserInfo(models.Model):            """            用户表:讲师和班主任            """            username = models.CharField(max_length=32)            password = models.CharField(max_length=64)            email = models.CharField(max_length=32)            ut = models.ForeignKey(to="UserType")      - choices  #这个适合用在字段类型不经常变动的情况下            # class UserInfo(models.Model):            #     """            #     用户表            #     """            #     username = models.CharField(max_length=32)            #     password = models.CharField(max_length=64)            #     email = models.CharField(max_length=32)            #            #     user_type_choices = (            #         (1, ‘班主任‘),            #         (2, ‘讲师‘),            #     )            #            #     user_type_id = models.IntegerField(choices=user_type_choices)   - 一张表中对同一个其他表做FK,M2M时,主要 related_name   - 注释

- 补充:         """         ID     Title          1      图片          2      挨踢1024          3      段子         """         class NewsType(models.Model):            title = models.CharField(max_length=32)

"""         ID   Title  Summary   News_Type         1    t....   科技...     2         2    t....   科技...     1         3    t....   科技...     2

"""         class News(models.Model):            title = models.CharField(max_length=32)            summary = models.CharField(max_length=255)            news_type = models.ForeignKey(to="NewsType")

# 查看所有新闻         new_list = News.objects.all()         for row in new_list:            print(row.title,row.summary,row.news_type.title)

"""         ID   Title  Summary   News_Type         1    t....   科技...     2         2    t....   科技...     1         3    t....   科技...     2

"""         class News(models.Model):            title = models.CharField(max_length=32)            summary = models.CharField(max_length=255)

news_type_chices = (               (1,‘图片‘),               (2,‘挨踢1024‘),               (3,‘段子‘),            )            news_type = models.IntegerField(choices=news_type_chices)

# 查看所有新闻         new_list = News.objects.all()         for row in new_list:            print(row.title,row.summary,  row.get_news_type_display()  )

2. 登录   - 装饰器   - Django内置+自定义配置文件3. 老师管理   - Form组件       - 创建类,继承Form      - 创建字段,字段=正则表达式; PS: 字段名称,required,  error_messages = {required,invalid}      - form = MyForm(data=request.POST)      - form.is_valid()      - form.cleaned_data      - form.errors

Form组件       1. 用户请求数据验证      2. 自动生成错误信息      3. 打包用户提交正确信息      4. 错误:保留上次输入内容      5. 定制页面上显示的HTML标签      Django Form组件      1. 创建规则(类,字段)         class Foo:            username = xxx            password = xxx            email = xxx      2. 数据和规则进行匹配         form = Foo(data=xxx,initial=初始化)         form.is_valid()         form.cleaned_data         form.errors

views代码:

from django.shortcuts import render,redirect,HttpResponse
from django.conf import settings
# Create your views here.

from app01 import models
def login(request):
    if request.method == "GET":
        return render(request,‘login.html‘)
    elif request.method =="POST":
        user = request.POST.get(‘user‘)
        pwd = request.POST.get(‘pwd‘)
        user = models.UserInfo.objects.filter(username=user,password=pwd).first()
        if not user:
            return render(request, ‘login.html‘,{‘msg‘:‘用户名或密码错误‘})
        # request.session[‘user_info‘] = {‘id‘:user.id, ‘username‘:user.username}

        request.session[settings.SJF] = {‘id‘:user.id, ‘username‘:user.username}
        return redirect(‘/index/‘)
    else:
        return HttpResponse(‘滚‘)

def auth(func):
    def inner(request,*args,**kwargs):
        user_info = request.session.get(settings.SJF)
        if not user_info:
            return redirect(‘/login/‘)
        return func(request,*args,**kwargs)
    return inner

@auth
def index(request):
    username = request.session[settings.SJF][‘username‘]
    return render(request,‘index.html‘,{‘username‘:username})

@auth
def teachers(request):
    # models.UserInfo.objects.filter(ut__title=‘讲师‘)
    teacher_list = models.UserInfo.objects.filter(ut_id=1)

    return render(request,‘teachers.html‘,{‘teacher_list‘:teacher_list})

from django.forms import Form
from django.forms import fields
from django.forms import widgets
class TeacherForm(Form):
    username = fields.CharField(
        required=True,
        error_messages={‘required‘:‘用户名不能为空‘},
        widget=widgets.TextInput(attrs={‘placeholder‘:‘用户名‘,‘class‘:‘form-control‘})
    ) # 不能为空
    password = fields.CharField(required=True,error_messages={‘required‘:‘密码不能为空‘}, widget=widgets.TextInput(attrs={‘placeholder‘:‘密码‘,‘class‘:‘form-control‘})) # 不能为空
    email = fields.EmailField(required=True,error_messages={‘required‘:‘邮箱不能为空‘,‘invalid‘:‘邮箱格式错误‘},widget=widgets.EmailInput(attrs={‘placeholder‘:‘邮箱‘,‘class‘:‘form-control‘}))   # 不能为空,且邮箱格式

@auth
def add_teacher(request):
    if request.method == ‘GET‘:
        form = TeacherForm()
        return render(request,‘add_teacher.html‘,{‘form‘:form})
    else:
        """
        1. 用户请求数据验证
        2. 自动生成错误信息
        3. 打包用户提交正确信息
        4. 错误:保留上次输入内容
        5. 定制页面上显示的HTML标签
        Django Form组件
        1. 创建规则(类,字段)
            class Foo:
                username = xxx
                password = xxx
                email = xxx
        2. 数据和规则进行匹配
        """
        form = TeacherForm(data=request.POST) # 数据和规则放置一起
        if form.is_valid():                       # 开始校验,并获取校验结果
            # print(‘执行成功‘,form.cleaned_data)          # 所有匹配成功,字典
            # {‘username‘: ‘asd‘, ‘password‘: ‘sdf‘, ‘email‘: ‘[email protected]‘,‘ut_id‘:1}
            form.cleaned_data[‘ut_id‘] = 1
            models.UserInfo.objects.create(**form.cleaned_data)
            return redirect(‘/teachers/‘)

        return render(request, ‘add_teacher.html‘,{‘form‘:form})

@auth
def edit_teacher(request,nid):
    obj = models.UserInfo.objects.filter(id=nid,ut_id=1).first()
    if not obj:
        return redirect(‘/teachers/‘)

    if request.method == "GET":
        # 显示input,并且将数据库中的默认值填写到input框中
        form = TeacherForm(initial={‘username‘:obj.username,‘password‘:obj.password,‘email‘:obj.email})
        return render(request,‘edit_teacher.html‘,{‘form‘:form})
    else:
        form = TeacherForm(data=request.POST)
        if form.is_valid():
            # 校验成功
            models.UserInfo.objects.filter(id=nid).update(**form.cleaned_data)
            return redirect(‘/teachers/‘)
        return render(request,‘edit_teacher.html‘,{‘form‘:form})

class TestForm(Form):
    caption = fields.CharField()
    # xxx = fields.ChoiceField(choices=[(1,‘讲师‘),(2,‘班主任‘)])
    # xxx = fields.ChoiceField(choices=models.UserInfo.objects.values_list(‘id‘,‘username‘))
    # xxx = fields.ChoiceField(choices=models.UserType.objects.values_list(‘id‘,‘title‘))
    xxx = fields.MultipleChoiceField(choices=models.UserInfo.objects.values_list(‘id‘,‘username‘))

def test(request):
    form = TestForm(initial={‘xxx‘:4})
    form = TestForm(initial={‘xxx‘:[1,2,3]})
    return render(request,‘test.html‘,{‘form‘:form})

时间: 2024-11-09 01:51:58

Django之form表单认证的相关文章

Django--分页器(paginator)、Django的用户认证、Django的FORM表单

分页器(paginator) >>> from django.core.paginator import Paginator >>> objects = ['john', 'paul', 'george', 'ringo'] >>> p = Paginator(objects, 2) >>> p.count #数据总数 4 >>> p.num_pages #总页数 2 >>> type(p.page

form表单,django的form表单,

django的表单系统,分2种, 基于django.forms.Form的所有表单类的父类, 基于django.forms.ModelForm,可以和模型类绑定的Form, 直接用原生的form表单,也可以直接用,较麻烦, django的form表单,也可用可不要, 在views里创建一个类,继承了forms.Form ,每个字段就是一个输入框, #----- #django 的form表单 from django import forms class MyForm(forms.Form): #

Django 中的Form表单认证

一.Form表单 ? 1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签 ? 1.2 创建表单类Form 1. 创建的类必须继承类:forms.Form 2. 字段名必须与前端表单中的名称一致(完全一样) 3. Field类是所有其他类的基类 #!/usr/bin/env python # -*- coding:utf-8 -*- import re from django import forms from d

django之form表单验证

django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf-8 -*- import re from django import forms from django.core.exceptions import ValidationError def mobile_validate(value): mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]

Form表单和django的form表单的补充,

form 表单中的button按钮, <button>提交</button>  :放在form表单中,会有一个提交事件,会提交form数据, <input type="button" value="提交">  :是一个单纯的按钮,没有任何默认事件, 先匹配url和视图函数 from django.conf.urls import url from django.contrib import admin from app01 imp

Django 之 form表单

Django中的Form表单 1.背景 平时我们在书写form表单时,经常都是手动的去写一些input标签,让用户输入一些功能,进行一些校验的判断,等等.Django中的form表单就能够帮我们去实现这些功能,比较便捷. 2.Django form表单的功能 1.生成页面可执行的HTML标签 2.对应户的数据进行校验 3.保留上次输入的内容 3.先用普通方式手写一个注册功能 1.views.py文件中 # 注册 def register(request): error_msg = ""

Django框架form表单配合ajax注册

总结一下,其实form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 下面是写的登录页面的实例 1:views视图中的代码 # 注册页面 def register(request): if request.method == 'POST': # 将提交过来的数据放的form表单中进行校验 form_obj = forms.Register(request.POST) # 判断校验是否真确 print(form_obj.is_valid()) ret

django 基于form表单上传文件和基于ajax上传文件

一.基于form表单上传文件 1.html里是有一个input type="file" 和 'submit'的标签 2.vies.py def fileupload(request): if request.method == 'POST': print(request.POST) print(request.FILES) # from django.core.files.uploadedfile import InMemoryUploadedFile print(type(reque

【django之form表单】

一.构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的模板: <form action="/your-name/" method="post"> <label for="your_name">Your name: </label> <input id="your_name" type="text" name="your