这一篇讲Django中的表单类Form
官方文档
Django表单系统的核心组件是 Form 类。它与Django模型描述对象的逻辑结构、行为以及它呈现给我们内容的形式的方式大致相同, Form 类描述一张表单并决定它如何工作及呈现。
类似于模型类的字段映射到数据库字段的方式,表单类的字段会映射到HTML表单的 元素。 ModelForm 通过 Form 映射模型类的字段到HTML表单的 元素,Django admin就基于此。
表单字段本身也是类;他们管理表单数据并在提交表单时执行验证。 DateField 和 FileField 处理的数据类型差别很大,所以必须用来处理不同的字段。
在浏览器中,表单字段以HTML“控件”(用户界面的一个片段)的形式展现给我们。每个字段类型都有与之相匹配的 控件类 ,但必要时可以覆盖。
这节做完的源代码
基础表单
为显示效果,这里还以发邮件为例
在一个app里面写一个forms.py
from django import forms
class NameForm(forms.Form):
your_name = forms.CharField(label='称谓', max_length=100)
contact = forms.CharField(max_length=11,label='手机号')
message = forms.CharField(widget=forms.Textarea,label='留言')
写一个视图函数formtest
这里还没有实现主要功能
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render
from .forms import NameForm
def formtest(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = NameForm(request.POST)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
# ...
# redirect to a new URL:
return HttpResponse('<发送成功>')
# if a GET (or any other method) we'll create a blank form
else:
form = NameForm()
return render(request, 'mainapp/name.html', {'form': form})
做一个模板mainapp/name.html
表单类的模板需要自己加form标签
{% extends 'index.html' %}
{% block title %}
表单示例
{% endblock %}
{% block content %}
<form action="/main/formtest" method="post" class="form form-control-plaintext">
{% csrf_token %}
{{ form }}
<input type="submit" value="提交">
</form>
{% endblock %}
显示效果
不要忘记,一张表单的输出 不 包含外层 标签以及 submit 控件。这些必须由你自己提供。
对于
{{ form.as_table }} will render them as table cells wrapped in tags
{{ form.as_p }} will render them wrapped in
tags
{{ form.as_ul }} will render them wrapped in
- tags
注意,您必须自己提供外层的 或-
元素。
使用.as_p,看上去效果好很多
调整模板内容,至少好看点
重排字段的话参照官方文档这里
给我们的视图函数加上发邮件功能
-
元素。
-
在判断成功的情况下取干净的数
if form.is_valid(): # process the data in form.cleaned_data as required #发邮箱 your_name=form.cleaned_data['your_name'] contact=form.cleaned_data['contact'] message=form.cleaned_data['message'] loginsource=request.META['REMOTE_ADDR'] mmessage='-->'.join([loginsource,your_name,contact,message]) subject='表单测试' from django.core.mail import send_mail send_mail(subject=subject,message=mmessage,recipient_list=['1015@qq.com'],from_email=None) # redirect to a new URL: return HttpResponse('<发送成功>')
结果就能收到啦
邮箱的密码会过期的,所以过期的话再重新申请一个
这个是没有做clean的情况,会莫名找不到属性
模型表单
定义模型表单类
class UserForm(forms.ModelForm): class Meta: model = UserModel fields='__all__' error_messages={ 'name':{ 'required':'这是用户必填项', 'max_length':'最长不超过20字符数' }, 'age':{ 'required':'这是用户必填项', }, 'number':{ 'max_length':'手机号不得超过11位' } }
model指的是模型
fields指的是字段,一般是列表,all指的是全部字段
其他的属性==》
排除的字段: exclude =
调整默认组件 : widgets = { ‘name’: Textarea(attrs={‘cols’: 80, ‘rows’: 20}), }
更改标签: labels = { ‘name’: _(‘Writer’), }
帮助信息 : help_texts = { ‘name’: _(‘Some useful help text.’), }
如果您想指定一个字段的验证器,可以通过声明定义该字段并设置其 validators 参数来实现:
slug = CharField(validators=[validate_slug])涉及到字段的信息及验证可以通过声明定义该字段并设置相应名字的参数,与基础的表单类使用基本一致
在 admin相应的用户管理器中增加属性
form = UserForm
此时的这里的 field可以被注释掉,但不注释掉也可以,当做排序字段
这是没加之前的 ,提示是:该字段是必填项
加了以后还有field的:已经提示是 这是用户必填项
没有field的时候会按照表单类的顺序排,然后表单类里面直接用的all,所以是按照模型里面字段出现的顺序排。
自定义手机号的验证规则
还是手机号的规则
在表单类里面加上这个函数def clean_number(self): number=self.cleaned_data.get('number') if re.match(r'1[1-57-9][0-9]{9}', number): print(number) return number raise ValidationError("表单验证,手机号格式不正确")
合理值就会保存,不合理的就会提示错误。
这个覆盖了原来在字段里设置的手机号验证