Django-表单

发布于:2024-08-10 ⋅ 阅读:(141) ⋅ 点赞:(0)

表单用于让用户提交数据或上传文件,也用于用户编辑已有数据。Django的表单Form类的作用是把用户输入的数据转化成Python对象格式,便于后续操作(比如存储、修改)。

自定义表单类

Django提供了两种自定义表单的方式:继承Form类和ModelForm类。前者你需要自定义表单中的字段,后者可以根据Django模型自动生成表单

from django import forms
from django.forms import ModelForm
from .models import MyModel
 
# 定义一个普通的表单
class SimpleForm(forms.Form):
    your_name = forms.CharField(label='Your Name', max_length=100)
    email = forms.EmailField(label='Email')
 
# 定义一个与模型关联的表单
class MyModelForm(ModelForm):
    class Meta:
        model = MyModel
        fields = '__all__'  # 这里可以指定字段,例如 ['field1', 'field2']

Django模型里用verbose_name来给字段添加一个别名或描述, 而表单用的是label

自定义的表单类一般位于app目录下的forms.py,这样方便集中管理表单。如果要使用上述表单,我们可以在视图里views.py里把它们像模型一样import进来直接使用。

自定义字段错误信息

每个字段你可以设置其是否为必需,最大长度和最小长度。你还可以针对每个字段自定义验证错误信息

from django import forms
​
class LoginForm(forms.Form):  
    username = forms.CharField(
        required=True,
        max_length=20,
        min_length=6,
        error_messages={
            'required': '用户名不能为空',
            'max_length': '用户名长度不得超过20个字符',
            'min_length': '用户名长度不得少于6个字符',
        }
    )
    password = forms.CharField(
        required=True,
        max_length=20,
        min_length=6,
        error_messages={
            'required': '密码不能为空',
            'max_length': '密码长度不得超过20个字符',
            'min_length': '密码长度不得少于6个字符',
        }
    )

继承ModelForm类的表单, 我们可以在Meta选项下widget中来自定义错误信息

from django.forms import ModelForm, Textarea
from myapp.models import Author
​
class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title', 'birth_date')
        widgets = {
            'name': Textarea(attrs={'cols': 80, 'rows': 20}),  # 关键是这一行
        }
        labels = {
            'name': 'Author',
        }
        help_texts = {
            'name': 'Some useful help text.',
        }
        error_messages = {
            'name': {
                'max_length': "This writer's name is too long.",
            },
        }

自定义表单输入widget

Django表单的每个字段你都可以选择你喜欢的输入widget,比如多选,复选框。你还可以定义每个widget的css属性。如果你不指定,Django会使用默认的widget。

比如下面这段代码定义了表单姓名字段的输入控件为Textarea,还指定了其样式css。

from django import forms
​
class ContactForm(forms.Form):
    name = forms.CharField(
        max_length=255,
        widget=forms.Textarea(
            attrs={'class': 'custom'},
        ),
    )

设置widget可以使表单大大美化,方便用户选择输入。比如下面案例里对年份使用了SelectDateWidget,对课程使用RadioSelect, 颜色则使用了复选框CheckboxSelectMultiple

from django import forms
​
BIRTH_YEAR_CHOICES = ('1980', '1981', '1982')
COLORS_CHOICES = (
    ('blue', 'Blue'),
    ('green', 'Green'),
    ('black', 'Black'),
)
​
class SimpleForm(forms.Form):
    birth_year = forms.DateField(
        widget=forms.SelectDateWidget(years=list(BIRTH_YEAR_CHOICES))
    )
    favorite_colors = forms.MultipleChoiceField(
        required=False,
        widget=forms.CheckboxSelectMultiple,
        choices=list(COLORS_CHOICES),
    )


网站公告

今日签到

点亮在社区的每一天
去签到