本文共 3208 字,大约阅读时间需要 10 分钟。
Django 的表单系统功能强大,除了基本的表单创建和验证功能外,还提供了许多高级功能。以下是一些实用的表单操作技巧,帮助你更高效地开发和维护表单。
对于每个字段,你可以设置其是否为必需、最大长度和最小长度等属性。你还可以针对每个属性自定义错误信息。
from django import formsclass 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 类中设置错误信息:
from django.forms import ModelFormfrom myapp.models import Authorclass 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 和 CSS 属性每个字段都可以选择自定义的输入 widget,如多选、复选框。你还可以定义每个 widget 的 CSS 属性。
from django import formsclass ContactForm(forms.Form): name = forms.CharField( max_length=255, widget=forms.Textarea( attrs={'class': 'custom'}, ), ) 常见的 widget 类包括:
TextInput:用于单行文本输入。Textarea:用于多行文本输入。Select:用于下拉菜单。CheckboxSelectMultiple:用于多选框。RadioSelect:用于单选框。有时我们需要对表单设置一些初始数据。可以通过 initial 方法实现。
form = ContactForm(initial={ 'name': 'First and Last Name',}) 对于 ModelForm,可以结合现有对象的数据进行实例化:
contact = Contact.objects.get(id=1)form = ContactForm(instance=contact)
对于自定义表单,可以设置 default_data:
default_data = { 'name': 'John', 'email': 'someone@hotmail.com',}form = ContactForm(default_data) validators除了通过 clean 方法自定义验证外,还可以选择自定义 validators。例如,验证手机号码格式:
from django.core.exceptions import ValidationErrorimport redef mobile_validate(value): mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$)') if not mobile_re.match(value): raise ValidationError('手机号码格式错误')class UserInfo(forms.Form): email = forms.EmailField(error_messages={ 'required': u'邮箱不能为空', }) mobile = forms.CharField( validators=[mobile_validate], error_messages={ 'required': u'手机不能为空', } ) widget=forms.TextInput( attrs={ 'class': "form-control", 'placeholder': u'手机号码', }, ) 很多情况下,我们希望用户在同一页面上点击一个按钮能同时提交2张或多张表单。可以在模板中为每个表单取不同的名字,如 form1 和 form2。
if request.method == 'POST': form1 = Form1(request.POST, prefix="form1") form2 = Form2(request.POST, prefix="form2") if form1.is_valid() or form2.is_valid(): # 处理逻辑 else: form1 = Form1(prefix="form1") form2 = Form2(prefix="form2")
以上是一些常用的 Django 表单高级使用技巧,希望对你有所帮助!
转载地址:http://qntp.baihongyu.com/