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. forEach() 和 map() 遍历

    1.forEach()   没有返回值. arr[].forEach(function(value,index,array){ //do something }) 参数:value数组中的当前项, i ...

  2. 安装sklearn_简练解决

    安装sklearn_简练解决 < 关键步骤标黑 > 第一步:更新pip  python -m pip install --upgrade pip 第二步:安装 scipy 在网址http: ...

  3. 线程同步的实现方式(volatile、synchronized、CountDownLatch)

    题目: 自定义容器,提供新增元素(add)和获取元素数量(size)方法.启动两个线程. 线程1向容器中新增10个数据.线程2监听容器元素数量,当容器元素数量为5时,线程2输出信息并终止. 方法一:v ...

  4. java注解小随笔

    注解分类 编码期间:SOURCE 编译期间:CLASS 运行期间:RUNTIME 自定义注解 //CLASS/RUNTIME/SOURCE 生效时机 @Retention(RetentionPolic ...

  5. Mapnik 3.0.20编译安装

    1. 确定epel安装 yum install -y epel-release 2. 按照<CentOS7.2部署node-mapnik>一文中的步骤,手动安装 gcc-6.2.0 和 b ...

  6. MySQL加入log_bin报错

    MySQL中二进制日志功能默认是关闭的,查看各种开启方式后,确定在配置文件中加入如下配置来开启该功能: [root@bogon /]# more /etc/my.cnf [mysqld] datadi ...

  7. 9.Redis高可用-哨兵

    9.Redis高可用-哨兵9.1 基本概念9.1.1 主从复制的问题9.1.2 高可用9.1.3 Redis Sentinel的高可用性9.2 安装和部署9.2.1 部署拓扑结构9.2.2 部署Red ...

  8. Chapter_4_JAVA作业

    一.类的封装,继承与多态 1.课前预习 1.1 举列现实生活中的封装,以及简述在程序中什么是属性的封装? 1.1.1 将东西捆绑在一起,如集成芯片:高压电线等等 1.1.2 封装就是将属性私有化,提供 ...

  9. 用JDOM和DOM4J解析节点名节点值

    1.用JDOM解析节点名和节点值 1.创建一个SAXBuilder对象 2.创建一个输入流, 将xml文件加载到文件中 3.   通过saxBuilder的方法,将输入流加载到saxBuilder 4 ...

  10. 修改oracle的字符集操作方法

    cmd环境下进行以下命令行的操作--连接sqlplus / as sysdba--命令行shutdown immediate; startup mount ALTER SYSTEM ENABLE RE ...