1、模型表单定义
forms.py
from django import forms
class NameForm(forms.Form):
your_name = forms.CharField(label='请输入你的名字', max_length=10)
view.py
from django.http import HttpResponse
from django.shortcuts import render
from the_12.Myforms import NameForm
# Create your views here.
def Hello(request):
form = NameForm()
return render(request,'the_12/myform.html',{'forme': form})
myform.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>这是表单页面</h1>
{{ forme }}
</body>
</html>
渲染表单到模板
{{ form }} {{ form as_table }} {{ form as_p }} {{ form as_ul }} {{ form attr }}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>这是表单页面</h1>
{# 渲染#}
{# {{ forme }}#}
{{ forme.as_ul}}
</body>
</html>
自定义表单名
{# 自定义保单名#}
账户名:{{ forme.your_name }}
2、表单提交
<form>
账户名:{{ forme.your_name }}
<input type="submit" value="确定">
</form>
3、表单验证
1、get 请求 —— 拿到网页,展示页面
2、post 请求 —— 提交数据给后台,需要声明请求的 url
urls.py
from django.urls import path
from .views import Hello
urlpatterns = [
path('Hello/', Hello, name='hello_form'),
]
myform.html
{# action 提交到哪里 method 以什么方式提交#}
<form action="{% url 'hello_form' %}" method="post">
账户名:{{ forme.your_name }}
<input type="submit" value="确定">
</form>
views.py
from django.http import HttpResponse
from django.shortcuts import render
from the_12.Myforms import NameForm
# Create your views here.
def Hello(request):
form = NameForm()
print(form.is_bound) # 查看是否绑定状态
return render(request,'the_12/myform.html',{'forme': form})
代码优化
views.py
from django.http import HttpResponse
from django.shortcuts import render
from django.views import View
from the_12.Myforms import NameForm
# Create your views here.
# def Hello(request):
# form = NameForm()
# print(form.is_bound) # 查看是否绑定状态
# return render(request,'the_12/myform.html',{'forme': form})
class Hello_from(View):
def get(self, request):
form = NameForm()
return render(request, 'the_12/myform.html', {'forme': form})
def posst(self, request):
form = NameForm(request.POST)
return render(request, 'the_12/myform.html', {'forme': form, 'post': True})
urls.py
from django.urls import path
from .views import Hello_from
urlpatterns = [
path('Hello/', Hello_from.as_view(), name='hello_form'),
]
myform.html
{# action 提交到哪里 method 以什么方式提交#}
<form action="{% url 'hello_form' %}" method="post">
账户名:{{ forme.your_name }}
<input type="submit" value="确定">
</form>
{# 判断是否post请求#}
{% if post %}
<div>这是post返回的内容</div>
{% endif %}
</body>
单个字段校验
基于 cleaned_data 的类方法 clean_<fieldname>()
myforms.py
from django import forms
# 表单定义
class NameForm(forms.Form):
your_name = forms.CharField(label='请输入你的名字', max_length=10)
def clean_your_name(self):
yourname = self.cleaned_data['your_name']
if yourname.startswith('fuck'): # 不能出现敏感字符(fuck)
raise forms.ValidationError('敏感字符,请重新输入') # 不通过就直接抛出错误
return yourname
views.py
from django.http import HttpResponse
from django.shortcuts import render
from django.views import View
from the_12.Myforms import NameForm
class Hello_from(View):
def get(self, request):
form = NameForm()
return render(request, 'the_12/myform.html', {'forme': form})
def post(self, request):
form = NameForm(request.POST)
# form.date date 属于原始数据,没有经过验证
if form.is_valid(): # 是否校验
print(form.cleaned_data) # 校验之后的数据
else:
print(form.errors)
return render(request, 'the_12/myform.html', {'forme': form, 'post': True})
效果
多字段校验
myforms.py
from django import forms
# 表单定义
class NameForm(forms.Form):
your_name = forms.CharField(label='请输入你的名字', max_length=10)
your_title = forms.CharField(label='请输入你的头衔')
def clean_your_name(self):
yourname = self.cleaned_data.get('your_name','')
if yourname.startswith('fuck'): # 不能出现敏感字符(fuck)
raise forms.ValidationError('敏感字符,请重新输入') # 不通过就直接抛出错误
return yourname
"""
name 以 hk 开头,title 必须使用 金牌讲师
"""
def clean(self):
name = self.cleaned_data.get('your_name','')
title = self.cleaned_data['your_title']
if name.startswith('hk') and title != '金牌讲师':
raise forms.ValidationError('name 以 hk 开头,title 必须使用 金牌讲师')
myform.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>这是表单页面</h1>
{# 渲染#}
{# {{ forme }}#}
{# {{ forme.as_ul}}#}
{# 自定义保单名#}
{# 账户名:{{ forme.your_name }}#}
{# action 提交到哪里 method 以什么方式提交#}
<form action="{% url 'hello_form' %}" method="post">
账户名:{{ forme.your_name }}<br>
头衔:{{ forme.your_title }}<br>
<input type="submit" value="确定">
</form>
{# 判断是否post请求#}
{% if post %}
<div>这是post返回的内容</div>
{% endif %}
</body>
</html>
4、字段校验
max_length=10 最大长度,最小长度 validators=[MinLengthValidator(3,'长度不能小于3')
from django import forms
from django.core.validators import MinLengthValidator
# 表单定义
class NameForm(forms.Form):
your_name = forms.CharField(label='请输入你的名字',
max_length=10,
validators=[MinLengthValidator(3,'长度不能小于3')])
自定义
from django import forms
from django.core.validators import MinLengthValidator
# 自定义
def my_validator(value):
if len(value) < 4:
raise forms.ValidationError('输入字段不能小于4')
# 表单定义
class NameForm(forms.Form):
your_name = forms.CharField(label='请输入你的名字',
max_length=10,
# validators=[MinLengthValidator(3,'长度不能小于3')])
validators=[my_validator])
your_title = forms.CharField(label='请输入你的头衔')