一、使用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='是否记住密码 ') 复制代码
-
5、使用自带的表单方式生成前端
html
页面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}) ... 复制代码
-
6、前端代码
<form action="/message/" method="post"> {% csrf_token %} <table> {{ form.as_table }} <tr> <td></td> <td> <input type="submit" value="提交"> </td> </tr> </table> </form> 复制代码
-
7、使用表单校验及获取输入框的值
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('失败') 复制代码
二、在表单中定义自己的错误提示
-
1、直接在表单中定义
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
required
必须填的invalid
无效的
- 3、
IntegerField
max_value
最大值min_value
最小值
- 4、直接使用正则表达式
四、自定义校验器
-
1、直接使用正则表达式
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 复制代码
-
3、多字段的校验(常见密码的校验)
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 复制代码
五、自己封装一个返回用户输入错误的信息提示
-
1、直接在
form
的类中定义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 复制代码
-
2、直接在视图中调用函数就可以获取错误信息
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
方法,可以将他提取到一个公共的基类中