目录
1. Django Form 简介
Django 提供了强大的表单功能,允许开发者通过 django.forms
模块快速创建表单组件,并处理用户输入。表单不仅用于前端显示,还提供了数据验证、清理和错误处理等功能。
Form 组件的作用:
- 数据输入:提供多种字段类型,如文本框、下拉框、单选框等,用于用户输入。
- 数据验证:通过内置的字段验证器,确保用户输入的数据有效。
- 自动化生成 HTML:Django 的 Form 类自动渲染表单 HTML 和处理表单提交。
2. Django Form 的基础组件
Django 的表单字段组件通过 django.forms
模块中的各类字段类来实现。以下是一些常见的字段类型:
2.1 CharField
CharField
用于文本输入字段,如名字、地址等。
1 2 3 4 | from django import forms class ContactForm(forms.Form): name = forms.CharField(max_length=100) |
- max_length:设置字段的最大长度。
- required:默认是
True
,如果设置为False
,字段变为可选。
2.2 IntegerField
IntegerField
用于接受整数输入。如果输入的内容不是有效的整数,Django 会自动验证并抛出错误。
1 2 | class AgeForm(forms.Form): age = forms.IntegerField(min_value=1, max_value=120) |
- min_value:设置该字段的最小值。
- max_value:设置该字段的最大值。
2.3 EmailField
EmailField
用于接收电子邮件地址,自动验证输入是否为有效的电子邮件格式。
1 2 | class EmailForm(forms.Form): email = forms.EmailField() |
- required:控制该字段是否为必填项。
- validators:可以自定义验证器,检查输入的电子邮件格式是否有效。
2.4 DateField
DateField
用于接收日期输入。用户输入的日期必须符合指定格式,否则会触发验证错误。
1 2 | class DateForm(forms.Form): birthdate = forms.DateField(widget=forms.SelectDateWidget()) |
- widget:可以使用
SelectDateWidget
来让用户选择日期。
2.5 BooleanField
BooleanField
用于接收布尔类型的输入,如复选框。该字段只能是 True
或 False
。
1 2 | class SubscribeForm(forms.Form): subscribe = forms.BooleanField(required=False) |
- required:设置该字段是否为必填项。
- initial:可以设置复选框的默认值。
3. Form 样式和验证
Django 表单组件可以自定义验证和显示样式。
3.1 验证
表单字段有内置的验证功能,可以自定义验证规则。在字段类中,使用 clean_<field_name>()
方法来定义自定义验证器。
1 2 3 4 5 6 7 8 | class ContactForm(forms.Form): email = forms.EmailField() def clean_email(self): email = self.cleaned_data['email'] if not email.endswith('@example.com'): raise forms.ValidationError('Email must be from example.com domain') return email |
- cleaned_data:包含经过验证后的字段数据。
- ValidationError:用于抛出自定义的验证错误。
3.2 渲染样式
通过表单组件的 widget
属性,Django 支持渲染 HTML 样式。
1 2 3 | class LoginForm(forms.Form): username = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Username'})) password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': 'Password'})) |
- widget:通过设置
attrs
来修改 HTML 输入字段的属性,例如placeholder
、class
等。
4. ModelForm
Django 提供了 ModelForm
类,简化了基于模型的表单创建。ModelForm
允许开发者从模型自动生成表单,减少了重复的字段定义。
4.1 定义 ModelForm
假设我们有一个 Book
模型,我们可以使用 ModelForm
来自动生成一个用于创建和编辑 Book
对象的表单。
1 2 3 4 5 6 7 | from django import forms from .models import Book class BookForm(forms.ModelForm): class Meta: model = Book fields = ['title', 'author', 'published_date'] |
- model:指定表单与哪个模型相关联。
- fields:指定该表单包含哪些字段。
4.2 使用 ModelForm 创建实例
1 2 3 | form = BookForm(request.POST) if form.is_valid(): form.save() # 保存表单数据到数据库 |
form.save()
方法会将表单数据保存为模型实例并自动插入到数据库。
4.3 自动生成表单
如果不指定 fields
,ModelForm
会自动为模型的所有字段生成表单字段。
1 2 3 | class BookForm(forms.ModelForm): class Meta: model = Book |
5. Django Form 小技巧
5.1 设置初始值
可以在表单实例化时设置字段的初始值。
1 | form = ContactForm(initial={'name': 'John Doe'}) |
这会使 name
字段的初始值为 “John Doe”。
5.2 使用自定义小部件
如果要自定义表单字段的外观,可以通过创建自定义的 widget
来修改字段的 HTML。
1 2 | class MyCustomForm(forms.Form): my_field = forms.CharField(widget=forms.Textarea(attrs={'rows': 4, 'cols': 40})) |
5.3 多表单处理
在一个视图中,你可以处理多个表单,通过判断表单的 POST
数据来区分不同的表单。
1 2 3 4 5 6 7 8 9 10 11 12 | def my_view(request): if request.method == 'POST': form1 = Form1(request.POST) form2 = Form2(request.POST) if form1.is_valid(): # 处理 form1 if form2.is_valid(): # 处理 form2 else: form1 = Form1() form2 = Form2() return render(request, 'my_template.html', {'form1': form1, 'form2': form2}) |
发表回复