day21_雷神_django第四天
django第四天
1、form组件
解决两个事情:
- 不想重复提交,数据重置;
- 校验规则
流程:
(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第四天的更多相关文章
- day24_雷神_django项目部署
# django项目部署 ... curl -I www.baidu.com 得到响应头信息 vim 里shift + % 找括号的另一半 find / -name virtualenv 3.创建虚拟 ...
- day20_雷神_django第三天
django第三天 动态路由,实现统一删除功能 urls url(r'^host_del/(host|user|group)/(\d+)$',views.host_del,name='del'), t ...
- day19_雷神_django第二天
django_day02 Django的路由系统 URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 1.URLconf配置 基本 ...
- day18_雷神_django第一天
# django_day01 1.http 协议 超文本传输协议,HTTP有很多应用,但最著名的是用于web浏览器和web服务器之间的双工通信. 协议概述 HTTP是一个客户端终端(用户)和服务器端( ...
- 【雷神源码解析】无基础看懂AAC码流解析,看不懂你打我
一 前言 最近在尝试学习一些视频相关的知识,随便一搜才知道原来国内有雷神这么一个真正神级的人物存在,尤其是在这里(传送门)看到他的感言更是对他膜拜不已,雷神这种无私奉献的精神应当被我辈发扬光大.那写这 ...
- 问题 A: 雷神领域
传送门 题目描述 L君,S大陆首屈一指的天才魔法师,创造了一个新魔法:雷神领域. 这个魔法会首先在地面上形成正方网格魔法阵列,然后在某些位置召唤雷电轴标.注意:一个位置只能有一个雷电轴标存在. 雷电 ...
- Python基础知识总结笔记(四)函数
Python基础知识总结笔记(四)函数python中的函数函数中的参数变量作用域偏函数PFA递归函数高阶函数BIFs中的高阶函数匿名函数lambda闭包Closure装饰器Decorator函数式编程 ...
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
随机推荐
- Python 的xlutils模块
python模块: xlrd:读取excel xlwt:写入excel 缺点:excel格式无法复用 推荐xlutils模块 可复制原excel格式 from xlutils.copy import ...
- Windows 窗体
Windows系统,顾名思义,就是窗口系统,每一个程序都可以用窗口来展示,所以,为了展示窗口,需要多做一系列的工作,当然,也有纯控制台应用,就不用附带窗口了. 首先就是窗口程序的入口地址,与传统的in ...
- Getting.Started.with.Unity.2018.3rd.Edition
Getting Started with Unity 2018 - Third Edition: A Beginner's Guide to 2D and 3D game development wi ...
- Educational Codeforces Round 35 (Rated for Div. 2)
Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...
- ASP.NET Core下发布网站图解
与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel ...
- linux-kernel-4.4 移植 (2)解决上部遗留DMA-PL330的问题
查看drivers/tty/serial/samsung.c文件发现,当传输数据量小于ourport->min_dma_size时,不使用DMA,大于等于min_mda_size时才是使用DMA ...
- 生产与学术之Pytorch模型导出为安卓Apk尝试记录
生产与学术 写于 2019-01-08 的旧文, 当时是针对一个比赛的探索. 觉得可能对其他人有用, 就放出来分享一下 生产与学术, 真实的对立... 这是我这两天对pytorch深度学习->a ...
- centos vi设置tab为4个空格 和括号自动补全
1.打开vim配置文件 vi /etc/vimrc 2.设置tab为4个空格, 在文件末尾添加以下内容 if has( "autocmd" ) filetype plugin in ...
- UI设计之动画—从虚拟到现实
以下内容由摹客团队翻译整理,仅供学习交流,摹客iDoc是支持智能标注和切图的产品协作设计神器. 用户界面设计中的动画一直是这几年热议的话题,尤其活跃在概念动画领域.它为设计师提供创造性实验并推动UI动 ...
- [gazebo-1] process has died [pid 22855, exit code 255,
[gazebo-1] process has died [pid 22855, exit code 255, cmd /opt/ros/kinetic/lib/gazebo_ros/gzserver ...