一、使用django
中自带的表单步骤主要有
- 1、创建一个项目
- 2、创建一个
app
- 3、在
app
里面创建一个forms.py
的文件
- 4、在
forms.py
中定义字段
from django import forms
class MessageForm(forms.Form):
"""
message的表单校验的
"""
title = forms.CharField(max_length=100, min_length=2, label='标题')
content = forms.CharField(widget=forms.Textarea, label='内容')
email = forms.EmailField(label='邮箱')
replay = forms.BooleanField(required=False, label='是否记住密码 ')
from django.shortcuts import render
from django.http import HttpResponse
from django.views import View
from . import forms
from . import models
class MessageView(View):
def get(self, request, *args, **kwargs):
form = forms.MessageForm()
return render(request, 'message.html', context={'form': form})
...
<form action="/message/" method="post">
{% csrf_token %}
<table>
{{ form.as_table }}
<tr>
<td></td>
<td>
<input type="submit" value="提交">
</td>
</tr>
</table>
</form>
class MessageView(View):
def get(self, request, *args, **kwargs):
form = forms.MessageForm()
return render(request, 'message.html', context={'form': form})
def post(self, request, *args, **kwargs):
form = forms.MessageForm(request.POST)
if form.is_valid():
print('表单校验成功')
title = form.cleaned_data.get('title')
content = form.cleaned_data.get('content')
email = form.cleaned_data.get('email')
replay = form.cleaned_data.get('replay')
print(title, content, email, replay)
return HttpResponse('成功')
else:
print('表单校验失败')
return HttpResponse('失败')
二、在表单中定义自己的错误提示
class MessageForm(forms.Form):
"""
message的表单校验的
"""
title = forms.CharField(max_length=100, min_length=2, label='标题', error_messages={'min_length': '最小是2个字符', 'max_length': '最大是100个字符'})
content = forms.CharField(widget=forms.Textarea, label='内容', error_messages={'required': '必须写内容'})
email = forms.EmailField(label='邮箱', error_messages={'required': '邮箱必填'})
replay = forms.BooleanField(required=False, label='是否记住密码 ')
三、关于表单中常用的字段
- 1、
CharField
max_length
这个字段最大长度
min_length
这个字段最小长度
required
这个字段必填的,默认是必填的
error_messages
错误提示
- 2、
EmailField
- 3、
IntegerField
max_value
最大值
min_value
最小值
- 4、直接使用正则表达式
四、自定义校验器
from django.core import validators
class MessageForm(forms.Form):
"""
message的表单校验的
"""
mobile = forms.CharField(validators=[validators.RegexValidator(r'1[345678]\d{9}', message='手机号码错误')])
- 2、异步校验(根据用户输入的手机号码判断数据库里面是否已经有了)
class RegisterForm(forms.Form):
"""
用户注册的form
"""
username = forms.CharField(max_length=18, min_length=3,
error_messages={'max_length': '最多18个字符', 'min_length': '最小3个字符'})
mobile = forms.CharField(validators=[validators.RegexValidator(r'1[345678]\d{9}', message='手机号码错误')])
def clean_mobile(self):
"""
自定义从数据库校验手机号码
:return:
"""
mobile = self.cleaned_data.get('mobile')
exists = models.User.objects.filter(mobile=mobile).exists()
if exists:
raise forms.ValidationError(message='{}手机号码已经存在'.format(mobile))
return mobile
class RegisterForm(forms.Form):
"""
用户注册的form
"""
username = forms.CharField(max_length=18, min_length=3,
error_messages={'max_length': '最多18个字符', 'min_length': '最小3个字符'})
mobile = forms.CharField(validators=[validators.RegexValidator(r'1[345678]\d{9}', message='手机号码错误')])
pwd1 = forms.CharField(max_length=18, min_length=6,
error_messages={'max_length': '最多16个字符', 'min_length': '最小6个字符'})
pwd2 = forms.CharField(max_length=18, min_length=6,
error_messages={'max_length': '最多16个字符', 'min_length': '最小6个字符'})
def clean_mobile(self):
"""
自定义从数据库校验手机号码
:return:
"""
mobile = self.cleaned_data.get('mobile')
exists = models.User.objects.filter(mobile=mobile).exists()
if exists:
raise forms.ValidationError(message='{}手机号码已经存在'.format(mobile))
return mobile
def clean(self):
clean_data = super().clean()
pwd1 = clean_data.get('pwd1')
pwd2 = clean_data.get('pwd2')
if pwd1 != pwd2:
raise forms.ValidationError(message='两次密码不一致')
return clean_data
五、自己封装一个返回用户输入错误的信息提示
class RegisterForm(forms.Form):
"""
用户注册的form
"""
username = forms.CharField(max_length=18, min_length=3, error_messages={'max_length': '最多18个字符', 'min_length': '最小3个字符'})
....
def get_errors(self):
"""
自己封装一个错误的返回
:return:
"""
errors = self.errors.get_json_data()
new_errors = {}
for key, message_dicts in errors.items():
messages = []
for message_dict in message_dicts:
message = message_dict['message']
messages.append(message)
new_errors[key] = messages
return new_errors
class MessageView(View):
def get(self, request, *args, **kwargs):
form = forms.MessageForm()
return render(request, 'message.html', context={'form': form})
def post(self, request, *args, **kwargs):
form = forms.MessageForm(request.POST)
if form.is_valid():
print('表单校验成功')
...
return HttpResponse('成功')
else:
print('表单校验失败')
print(form.get_errors())
return HttpResponse('失败')
- 3、如果想所有的表单中都具备
get_errors
方法,可以将他提取到一个公共的基类中