django第四天

1、form组件

解决两个事情:

  1. 不想重复提交,数据重置;
  2. 校验规则

流程:

(1) 创建form组件对应的类,比如LoginForm
(2)
views.login: if get请求:
form_obj=LoginForm()
return render(request,"login.html",{"form_obj":form_obj}) # 由form_obj渲染form表单的有效控件 渲染方式三种:
1
<form action="" novalidate method="post">
{% csrf_token %}
{{ form_obj.as_p }}
<input type="submit">
</form> 2
<form action="" novalidate method="post">
{% csrf_token %}
<div>
<label for="">用户名</label>
{{ form_obj.user }} <span>{{ form_obj.errors.user.0 }}</span>
</div>
<div>
<label for="">密码</label>
{{ form_obj.pwd }}<span>{{ form_obj.errors.pwd.0 }}</span>
</div>
<input type="submit">
</form> 3 <form action="" novalidate method="post">
{% csrf_token %}
{% for field in form_obj %}
<div>
<label for="">{{ field.label }}</label>
{{ field }}
</div>
{% endfor %} <input type="submit">
</form> if post请求: form_obj = LoginFrom(request.POST)
if form_obj.is_valid():
form_obj.cleaned_data # 所有的有效数据 else:
#form_obj.errors # {}
#form_obj.errors.get("user") # [] return render(request, "login.html", {"form_obj": form_obj})

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^register/', views.register),
]

models.py

from django.db import models

# Create your models here.

class UserInfo(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32,default=1)

views.py

from django.shortcuts import render, HttpResponse
from .models import *
# Create your views here.
from django import forms
from django.forms import widgets
from django.core.exceptions import ValidationError class RegForm(forms.Form):
name = forms.CharField(
label='用户名',
max_length=16,
min_length=3,
error_messages={
"required": "不能为空",
"invalid": "格式错误",
"min_length": "用户名最短3位",
"max_length": "用户名最长16位"
}
) pwd = forms.CharField(
error_messages={
"required": "不能为空",
},
widget=widgets.PasswordInput(attrs={})
) repeat_pwd = forms.CharField(
error_messages={
"required": "不能为空",
},
widget=widgets.PasswordInput(attrs={})
) email = forms.EmailField()
phone = forms.CharField() def clean_user(self):
val = self.cleaned_data.get('user') # 注意是cleaned_data
ret = UserInfo.objects.filter(name=val)
if not ret:
return val # 通过,返回该值,不通过,返回错误信息,ValidationError()
else:
raise ValidationError('该用户已注册') def clean_phone(self):
val = self.cleaned_data.get('phone')
import re
ret = re.search("^1[3578]\d{9}$", val)
if ret:
return val
else:
raise ValidationError('手机号格式错误') def clean(self): # clean是全局钩子
pwd = self.cleaned_data.get('pwd')
repeat_pwd = self.cleaned_data.get('repeat_pwd')
if pwd == repeat_pwd:
return self.cleaned_data
else:
raise ValidationError('两次密码不一致') def register(request):
if request.method == 'POST':
reg_form = RegForm(request.POST)
if reg_form.is_valid():
name = reg_form.cleaned_data.get('name')
pwd = reg_form.cleaned_data.get('pwd')
UserInfo.objects.create(name=name, pwd=pwd)
return HttpResponse('注册成功!')
else:
all_err = reg_form.errors.get('__all__')
print(all_err)
return render(request, 'register.html', locals())
reg_form = RegForm()
return render(request, 'register.html', locals()) # 包含函数执行,到这locals的所有局部变量。

templates

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>注册页面</h1> <form action="" method="post" novalidate> {% csrf_token %}
{% for field in reg_form %} <div>
<label for=""> {{ field.label }}</label>
{{ field }} <span>{{ field.errors.0 }}</span> {% if field.label == 'Repeat pwd' %}
<span>{{ all_err.0 }}</span>
{% endif %}
</div>
{% endfor %}
<button type="submit">提交</button>
</form>
</body>
</html>

2、用户认证auth模块

request.user 存的是当前用户的对象,没有登录的话是一个匿名用户对象。

1 使用auth_user表作为用户表

2 登录:
user=auth.authenticate(username=user,password=pwd)
auth.login(request,user) # session写操作
auth.logout(request) # request.session.flush() 验证 user.is_authenticated() # 登录状态时,返回True,否则返回False 创建用户:User.objects.create_user(username="egon123",password="1234")

3、 ajax

locals() 深拷贝 完全独立,模板里改变变量的值,函数里的值不会改变。

ajax

	https://www.cnblogs.com/maple-shaw/articles/9524153.html
1. 发请求的途径
1. 在浏览器地址上输入地址 回车 ——》 GET
2. form表单 ——》 GET / POST
3. a标签 ——》 GET
2. ajax
使用js技术发送异步请求 一般传输json数据
特点:
局部刷新 当前页面不刷新
异步 1. 计算示例 $.ajax({
url:'/calc1/',
type:'post',
data:{
i1:$('[name="ii1"]').val(),
i2:$('[name="ii2"]').val()
},
success:function (res) {
console.log(res);
$('[name="ii3"]').val(res)
}
})
2. ajax的参数介绍
上传文件
form_obj = new FormData();
form_obj.append('f1', $('#f1')[0].files[0]);
# jquery对象转换为dom对象,方法files,可能传多个文件,只要一个,【0】,这就包含了数据得form_data对象。
$.ajax({
url: '/upload/',
type: 'post',
processData: false,
# 告诉ajax不处理编码方式,enctype=form——data,这个form——obj本身就是这个编码方式,但是django会默认帮你改成urlencode得方式,告诉django不用改
contentType: false, # 告诉ajax不处理contentType,数据类型,不改请求头
data: form_obj,
success: function (res) {
console.log(res); # 返回的响应的响应体
},
}) 2.
headers:{'X-csrftoken':$('[name="csrfmiddlewaretoken"]').val()}, 3、 使用文件

day21_雷神_django第四天的更多相关文章

  1. day24_雷神_django项目部署

    # django项目部署 ... curl -I www.baidu.com 得到响应头信息 vim 里shift + % 找括号的另一半 find / -name virtualenv 3.创建虚拟 ...

  2. day20_雷神_django第三天

    django第三天 动态路由,实现统一删除功能 urls url(r'^host_del/(host|user|group)/(\d+)$',views.host_del,name='del'), t ...

  3. day19_雷神_django第二天

    django_day02 Django的路由系统 URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 1.URLconf配置 基本 ...

  4. day18_雷神_django第一天

    # django_day01 1.http 协议 超文本传输协议,HTTP有很多应用,但最著名的是用于web浏览器和web服务器之间的双工通信. 协议概述 HTTP是一个客户端终端(用户)和服务器端( ...

  5. 【雷神源码解析】无基础看懂AAC码流解析,看不懂你打我

    一 前言 最近在尝试学习一些视频相关的知识,随便一搜才知道原来国内有雷神这么一个真正神级的人物存在,尤其是在这里(传送门)看到他的感言更是对他膜拜不已,雷神这种无私奉献的精神应当被我辈发扬光大.那写这 ...

  6. 问题 A: 雷神领域

    传送门 题目描述 L君,S大陆首屈一指的天才魔法师,创造了一个新魔法:雷神领域.  这个魔法会首先在地面上形成正方网格魔法阵列,然后在某些位置召唤雷电轴标.注意:一个位置只能有一个雷电轴标存在. 雷电 ...

  7. Python基础知识总结笔记(四)函数

    Python基础知识总结笔记(四)函数python中的函数函数中的参数变量作用域偏函数PFA递归函数高阶函数BIFs中的高阶函数匿名函数lambda闭包Closure装饰器Decorator函数式编程 ...

  8. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  9. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

随机推荐

  1. 网络通信实验(1)STM32F4 以太网简介

    STM32F4 以太网简介 STM32F407 芯片自带以太网模块,该模块包括带专用 DMA 控制器的 MAC 802.3(介质访问控制)控制器,支持介质独立接口 (MII) 和简化介质独立接口 (R ...

  2. 如何看iOS崩溃日志

    重点:Triggered by Thread这句话后边的线程号,快速定位问题出现在那个线程,是否是你的锅:Triggered by Thread所指的线程表示导致异常.崩溃的线程 下边内容转自简书 简 ...

  3. windows下的mongodb安装与配置

    一.下载mongodb安装文件 https://www.mongodb.com/download-center/community 选择zip压缩包方式,如:mongodb-win32-x86_64- ...

  4. oracle自带总页数分页sql

    string strSQL = string.Format(@"select * from( with temp as (select * from * where {0} order by ...

  5. css三列布局之双飞翼pk圣杯

    三列布局:两边定宽,中间自适应! 看到这个问题,我第一眼想的就是两边定宽float左右,中间加一个margin宽度自适应或者直接设一个overflow:hidden触发bfc机制,这样也可以,看上去也 ...

  6. 常用的三种json软件的使用

    从几个角度比较三种软件 1. json操作 2 反解 3 性能 易用性还没有列出. 可以根据个人喜好进行取舍. package json; import com.alibaba.fastjson.JS ...

  7. JS的深浅拷贝

    项目中根据各种需求或多或少会需要用到拷贝,通过查询整理之后今天简单的记录一下. 我们可以利用 slice.concat 返回一个新数组的特性可以实现数组的拷贝. var arr = ['a', 1, ...

  8. [精华][推荐]CAS SSO实现单点登录框架学习源码

    1.通过下载稳定版本的方式下载cas的相关源码包,如下: 直接选择4.2.1的稳定代码即可 2.我们项目中的版本版本使用maven apereo远程库去下载 通过远程maven库下载cas-serve ...

  9. X of a Kind in a Deck of Cards LT914

    In a deck of cards, each card has an integer written on it. Return true if and only if you can choos ...

  10. Asp.net Zero 应用实战-官方示例PhoneBook学习1_修改1版

    适用Zero版本:ASP.NET Core & Angular 2+ (aspnet-zero-core-3.1.0). 该版本官方有两个solution文件夹:Angular(前端) 和 a ...