文章目录

  • Form和modelform
    • Form自动生成登录标签并校验
    • 其他属性
    • 校验器组件
    • Hook钩子方法
      • 局部钩子和全局钩子
    • modelform
    • 同源和跨域
      • 简单请求跨域

Form和modelform

参考:https://www.cnblogs.com/clschao/articles/10486468.html

Form自动生成登录标签并校验

# views.py
class LoginForm(forms.Form):name = forms.CharField(label='用户名:',initial='小李',max_length=16,min_length=6,widget=forms.widgets.TextInput(attrs={'class':'form-control'}),  # 密码输入不可见,括号里边加样式)password = forms.CharField(label='密码:',widget=forms.widgets.PasswordInput(attrs={'class':'form-control'}),  # 密码输入不可见,括号里边加样式)sex = forms.ChoiceField(label='性别',choices=((1,"男"), (2, "女"), (3, "其他")),widget=forms.widgets.RadioSelect(),initial=3,)city = forms.ChoiceField(label='城市',choices=((1,"北京"), (2, "上海"), (3, "东莞")),widget=forms.widgets.Select(),  # 下拉框initial=3,)hobby = forms.ChoiceField(label='爱好',choices=((1,"抽烟"), (2, "喝酒"), (3, "烫头")),widget=forms.widgets.CheckboxSelectMultiple,  # 多选框, SelectMultiple多选下拉框initial=3,)birthday = forms.CharField(label='生日',widget=forms.widgets.TextInput(attrs={'type':'date'}),)def register(request):form_obj = LoginForm()if request.method == 'GET':return render(request, 'register.html',{'form_obj':form_obj})else:username = request.POST.get('name')password = request.POST.get('password')print(username, password)return HttpResponse('登录成功')
# register.html
<form action="" method="post">{% csrf_token %}
{#    用户名:<input type="text" name="username">#}
{#    密码:<input type="password" name="password">#}<div><label for="">{{ form_obj.name.label }}</label>{{ form_obj.name }}</div><div><label for="">{{ form_obj.password.label }}</label>{{ form_obj.password }}</div><div><label>{{ form_obj.sex.label }}</label>{{ form_obj.sex }}</div><div><label>{{ form_obj.city.label }}</label>{{ form_obj.city }}</div><div><label>{{ form_obj.hobby.label }}</label>{{ form_obj.hobby }}</div><div><label>{{ form_obj.birthday.label }}</label>{{ form_obj.birthday }}</div>
{#    {{ form_obj.as_p }}#}<input type="submit">
</form>

其他属性

class LoginForm(forms.Form):name = forms.CharField(required=False,label='用户名:',initial='小李',max_length=16,min_length=6,error_messages={'requried':'不能为空','min_length':'不能太短'},widget=forms.widgets.TextInput(attrs={'class':'form-control'}),  # 密码输入不可见,括号里边加样式)def register(request):form_obj = LoginForm()if request.method == 'GET':return render(request, 'register.html',{'form_obj':form_obj})else:# username = request.POST.get('name')# password = request.POST.get('password')# print(username, password)# request.POST = name:"ssss"form_obj = LoginForm(request.POST)if form_obj.is_valid():  # 做校验print(form_obj.cleaned_data)  # 通过的校验数据else:print(form_obj.errors)return render(request, 'register.html', {'form_obj':form_obj})return HttpResponse('登录成功'){##novalidate 关闭浏览器校验#}
<form action="" method="post" novalidate>{% csrf_token %}
{#    用户名:<input type="text" name="username">#}
{#    密码:<input type="password" name="password">#}<div><label for="">{{ form_obj.name.label }}</label>{{ form_obj.name }}
{#        # 不取列表,只取一个#}{{ form_obj.name.errors.0 }}</div><input type="submit">
</form>

校验器组件

import re
from django.core.exceptions import ValidationError
def mobile_validate(value):mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')if not mobile_re.match(value):raise ValidationError('手机号码格式错误')  #自定义验证规则的时候,如果不符合你的规则,需要自己发起错误class LoginForm(forms.Form):name = forms.CharField(required=False,label='用户名:',initial='小李',max_length=16,min_length=6,error_messages={'requried':'不能为空','min_length':'不能太短'},# validators=[RegexValidator(r'^金瓶梅','没看过金瓶梅不能通过'),],validators=[mobile_validate, ],widget=forms.widgets.TextInput(attrs={'class':'form-control'}),  # 密码输入不可见,括号里边加样式)

Hook钩子方法

在Form类中定义钩子函数,来实现自定义的验证功能。

源码分析:https://www.bilibili.com/video/BV1aJ411H7Ej?p=405

局部钩子和全局钩子

import re
from django.core.exceptions import ValidationError
def mobile_validate(value):mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')if not mobile_re.match(value):raise ValidationError('手机号码格式错误')  #自定义验证规则的时候,如果不符合你的规则,需要自己发起错误class LoginForm(forms.Form):name = forms.CharField(required=False,label='用户名:',initial='小李',max_length=16,min_length=6,error_messages={'requried':'不能为空','min_length':'不能太短'},validators=[RegexValidator(r'^金瓶梅','没看过金瓶梅不能通过'),],# validators=[mobile_validate, ],widget=forms.widgets.TextInput(attrs={'class':'form-control'}),  # 密码输入不可见,括号里边加样式)# 局部钩子def clean_name(self):value = self.cleaned_data['name']if '小李' in value:raise ValidationError('含有敏感词汇:小李')else:return value# 全局钩子def clean(self):value = self.cleaned_datap1 = value['password']p2 = value['r_password']if p1 == p2:return valueelse:# raise ValidationError('两次输入的密码不一致')self.add_error('r_password','两次输入的密码不一致')raise ValidationError('两次输入的密码不一致')<form action="" method="post" novalidate>{% csrf_token %}
{#    用户名:<input type="text" name="username">#}
{#    密码:<input type="password" name="password">#}<div><label for="">{{ form_obj.name.label }}</label>{{ form_obj.name }}
{#        # 不取列表,只取一个#}{{ form_obj.name.errors.0 }}</div><div><label for="">{{ form_obj.password.label }}</label>{{ form_obj.password }}</div><div><label for="">{{ form_obj.r_password.label }}</label>{{ form_obj.r_password }}</div># html
<body>
<div class="container"><h1>student</h1><form method="POST" novalidate>{% csrf_token %}{# {{ student_list.as_p }}#}{% for student in student_list %}<div class="form-group col-md-6">{# 拿到数据字段的verbose_name,没有就默认显示字段名 #}<label class="col-md-3 control-label">{{ student.label }}</label><div class="col-md-9" style="position: relative;">{{ student }}</div></div>{% endfor %}<div class="col-md-2 col-md-offset-10"><input type="submit" value="提交" class="btn-primary"></div></form>
</div>
</body>

获取数据库中数据并展示

publishs = forms.ModelChoiceField(label='出版社',queryset=models.Publish.objects.all(),
)

modelform

modelform会自动生成你的model类(表)对应的字段的Form类

# models.py
class Book(models.Model):nid = models.AutoField(primary_key=True)title = models.CharField( max_length=32)publishDate=models.DateField()price=models.DecimalField(max_digits=5,decimal_places=2)publish=models.ForeignKey(to="Publish",to_field="nid")authors=models.ManyToManyField(to='Author',)def __str__(self):return self.title# views.py
class BookForm(forms.ModelForm):class Meta:model = models.Bookfields = "__all__"labels = {"title": "书名","price": "价格"}widgets = {"password": forms.widgets.PasswordInput(attrs={"class": "c1"}),"publishDate": forms.widgets.DateInput(attrs={"type": "date"}),}#局部钩子:def clean_title(self):pass#全局钩子def clean(self):passdef __init__(self,*args,**kwargs): #批量操作super().__init__(*args,**kwargs)for field in self.fields:#field.error_messages = {'required':'不能为空'} #批量添加错误信息,这是都一样的错误,不一样的还是要单独写。self.fields[field].widget.attrs.update({'class':'form-control'})

class meta常用参数

model = models.Book  # 对应的Model中的类
fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段
exclude = None  # 排除的字段
labels = None  # 提示信息
help_texts = None  # 帮助提示信息
widgets = None  # 自定义插件
error_messages = None  # 自定义错误信息
error_messages = {'title':{'required':'不能为空',...} #每个字段的所有的错误都可以写,...是省略的意思,复制黏贴我代码的时候别忘了删了...
}

任务

CRM 客户关系管理系统

(jq22.com 登录注册模板 扒页面模板)

同源和跨域

https://www.cnblogs.com/clschao/articles/10745966.html

深入理解python异步编程

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

简单请求跨域

创建两个django项目,第一个叫做s1,一个叫做s2,s1用8000端口启动,s2用8001端口启动

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h2>s1的首页</h2>
<button id="btn">Ajax请求</button><script src="https://cdn.bootcss.com/jquery/3.4.0/jquery.js"></script>
<script>$('#btn').click(function () {$.ajax({//url:'/books/', 访问自己服务器的路由,同源(ip地址、协议、端口都相同才是同源)url:'http://127.0.0.1:8001/books/', //访问其他服务器的路由,不同源,那么你可以访问到另外一个服务器,但是浏览器将响应内容给拦截了,并给你不同源的错误:Access to XMLHttpRequest at 'http://127.0.0.1:8001/books/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header has a value 'http://127.0.0.1:8002' that is not equal to the supplied origin.#并且注意ip地址和端口后面是一个斜杠,如果s2的这个url没有^books的^符号,那么可以写两个//。        type:'get',success:function (response) {console.log(response);}})})</script>
</body>
</html>from django.shortcuts import render,HttpResponse
from django.http import JsonResponse
# Create your views here.def index(request):return render(request,'index.html')def books(request):# return JsonResponse(['西游记','三国演义','水浒传'],safe=False)obj = JsonResponse(['西游记','三国演义','水浒传'],safe=False)return obj# s2
from django.shortcuts import render
from django.http import JsonResponse
# Create your views here.
def books(request):# return JsonResponse(['西游记2','三国演义2','水浒传2'],safe=False)obj = JsonResponse(['西游记2','三国演义2','水浒传2'],safe=False)#下面这个响应头信息是告诉浏览器,不要拦着,我就给它,"*"的意思是谁来请求我,我都给# obj["Access-Control-Allow-Origin"] = "*"obj["Access-Control-Allow-Origin"] = "http://127.0.0.1:8000" #只有这个ip和端口来的请求,我才给他数据,其他你浏览器帮我拦着return obj

Django基础---Form和modelform校验器、同源和跨域问题相关推荐

  1. Spring Boot——Spring Security环境下跨域addCorsMappings与拦截器冲突导致跨域失效解决方案

    问题分析 [SpringMVC]与权限拦截器冲突导致的Cors跨域设置失效问题 解决方案 @Beanpublic CorsFilter corsFilter() {//1.添加CORS配置信息Cors ...

  2. SpringBoot中配置拦截器时,跨域失效

    SpringBoot中配置拦截器时,跨域失效 前后段分离的项目,配置了跨域后,访问正常,但是配置了拦截器以后,有的访问正常,有的出现跨域问题,发现出现跨域问题的都是拦截器里面没有放行的请求. @Con ...

  3. Django 【第二十篇】后端CORS解决跨域问题

    一.为什么会有跨域问题? 是因为浏览器的同源策略是对ajax请求进行阻拦了,但是不是所有的请求都给做跨域,像是一般的href属性,a标签什么的都不拦截. 二.解决跨域问题的两种方式 JSONP COR ...

  4. 全局配置axios、axios 拦截器 和 proxy 跨域代理

    目录 一.全局配置axios 1. 为什么要全局配置 axios 2. 如何全局配置 axios 3. 在 vue3 的项目中全局配置axios ​ 4. 在 vue2 的项目中全局配置 axios ...

  5. vue3.0-axios拦截器、proxy跨域代理

    目录 1. vue-cli 1)vue-cli 2)安装vue-cli ①解决Windows PowerShell不识别vue命令的问题 3)创建项目 4)基于vue ui创建vue项目 5)基于命令 ...

  6. Django之form组件is_valid校验机制

    #先来归纳一下整个流程 #(1)首先is_valid()起手,看seld.errors中是否值,只要有值就是flase #(2)接着分析errors.里面判断_errors是都为空,如果为空返回sel ...

  7. Django之Form验证clean方法(验证篇六)

    上一篇:Django之Form验证select的choice选项数据从数据库实时调用(验证篇五)点击跳转 目录篇:Django之Form及ModelForm目录篇 点击跳转 下一篇:django之mo ...

  8. 解决跨域form表单post提交时Forbidden的问题。

    我最近遇到一个问题,就是使用母版时,在主母版下有一个模态框,在子模板中(具体页)调用了这个模态框,并且这个模态框是form表单post的提交,当然一定要设置{% csrf_token %}的,但是通过 ...

  9. Django 跨域问题解决

    什么是跨域? 在前后端分离的项目中,跨域是一个必不可少的问题,也是一个很正常的问题,那么什么是跨域? 跨域就是基于同源策略,不同IP.域名.端口都算作跨域. 同源策略是浏览器的安全策略. 同源:同源( ...

最新文章

  1. Meta祭出元宇宙「阿拉丁神灯」!LeCun称世界模型将带来像人一样的AI
  2. python爬虫知识大全_(硬知识)Python爬虫知识点梳理,认真看好好学
  3. arg是什么函数_怎么实现边听歌边搜图?线程初体验:常用函数
  4. 4.4 高斯消元法的矩阵表示
  5. php中的字符串常用函数(四) ord() 获得字符的ascii码 chr()获取ascii码对应的字符...
  6. 农行支付php,ECSHOP教程:农行支付接口开发(含手机端)
  7. 团队博客 第三周 设计类图
  8. IDEA中如何配置Tomcat和项目?
  9. 第一篇:webservice初探
  10. ajax 关闭弹窗并跳转到url_Python 爬虫 | Ajax数据爬取
  11. C语言简易学生管理系统(含源码)
  12. mysql 查询替换语句_MYSQL查询字符替换sql语句
  13. win10 下mysql环境变量配置
  14. 天书 kdb+之q语言
  15. HTTP 多处理模块(MPM)
  16. 关于模拟信号和数字信号的储存
  17. android源码定制之初探--定制android关机界面
  18. HTML(超文本标记语言)
  19. ESP8266学习笔记:实现ESP8266的局域网内通信
  20. 十五天学会Autodesk Inventor,看完这一系列就够了(七),工程图纸

热门文章

  1. 【RDMA】技术详解(一):RDMA概述
  2. Android Q wifi已连接但显示“已保存”无法上网
  3. Transaction rolled back because it has beenmarked as rollback-only
  4. Saltstack_使用指南05_数据系统-Pillar
  5. 快捷方式管理程序(网吧游戏菜单) SQLite本地数据库
  6. 2018.11 企业战略课堂笔记3 五力模型
  7. c语言需要的软件,需要C语言的需要什么工具软件
  8. Filebeat入门
  9. 洛必达法则 - 但是高中OIer并不觉得它很有用
  10. 【腾讯地图】腾讯地图定位解析