目录

  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 用于文本输入字段,如名字、地址等。

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length=100)

  • max_length:设置字段的最大长度。
  • required:默认是 True,如果设置为 False,字段变为可选。

2.2 IntegerField

IntegerField 用于接受整数输入。如果输入的内容不是有效的整数,Django 会自动验证并抛出错误。

class AgeForm(forms.Form):
    age = forms.IntegerField(min_value=1, max_value=120)

  • min_value:设置该字段的最小值。
  • max_value:设置该字段的最大值。

2.3 EmailField

EmailField 用于接收电子邮件地址,自动验证输入是否为有效的电子邮件格式。

class EmailForm(forms.Form):
    email = forms.EmailField()

  • required:控制该字段是否为必填项。
  • validators:可以自定义验证器,检查输入的电子邮件格式是否有效。

2.4 DateField

DateField 用于接收日期输入。用户输入的日期必须符合指定格式,否则会触发验证错误。

class DateForm(forms.Form):
    birthdate = forms.DateField(widget=forms.SelectDateWidget())

  • widget:可以使用 SelectDateWidget 来让用户选择日期。

2.5 BooleanField

BooleanField 用于接收布尔类型的输入,如复选框。该字段只能是 TrueFalse

class SubscribeForm(forms.Form):
    subscribe = forms.BooleanField(required=False)

  • required:设置该字段是否为必填项。
  • initial:可以设置复选框的默认值。

3. Form 样式和验证

Django 表单组件可以自定义验证和显示样式。

3.1 验证

表单字段有内置的验证功能,可以自定义验证规则。在字段类中,使用 clean_<field_name>() 方法来定义自定义验证器。

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 样式。

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 对象的表单。

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 创建实例

form = BookForm(request.POST)
if form.is_valid():
    form.save()  # 保存表单数据到数据库

  • form.save() 方法会将表单数据保存为模型实例并自动插入到数据库。

4.3 自动生成表单

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

class BookForm(forms.ModelForm):
    class Meta:
        model = Book


5. Django Form 小技巧

5.1 设置初始值

可以在表单实例化时设置字段的初始值。

form = ContactForm(initial={'name': 'John Doe'})

这会使 name 字段的初始值为 “John Doe”。

5.2 使用自定义小部件

如果要自定义表单字段的外观,可以通过创建自定义的 widget 来修改字段的 HTML。

class MyCustomForm(forms.Form):
    my_field = forms.CharField(widget=forms.Textarea(attrs={'rows': 4, 'cols': 40}))

5.3 多表单处理

在一个视图中,你可以处理多个表单,通过判断表单的 POST 数据来区分不同的表单。

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. 参考资料

出站链接

站内链接