目录

  1. Django Form 简介
  2. Django Form 的基础组件
  3. Form 样式和验证
  4. ModelForm
  5. Django Form 小技巧
  6. 参考资料

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 用于接收布尔类型的输入,如复选框。该字段只能是 TrueFalse

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 输入字段的属性,例如 placeholderclass 等。

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 自动生成表单

如果不指定 fieldsModelForm 会自动为模型的所有字段生成表单字段。

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})

6. 参考资料

出站链接

站内链接