ModelForm

如果正在构建一个数据库驱动的应用程序,那么可能会用于与Django模型紧密相关的表单。Django提供了一个辅助类实现Django的ORM模型的model创建表单。
示例:

>>> from django.forms import ModelForm
>>> from myapp.models import Article

>>> class ArticleForm(ModelForm):
...     class Meta:
...         model = Article
...         fields = ['pub_date', 'headline', 'content', 'reporter']

>>> form = ArticleForm()

>>> article = Article.objects.get(pk=1)
>>> form = ArticleForm(instance=article)

字段类型

生成的Form类将按照fields属性中指定的顺序为指定的每个字段提供一个表单字段。

模型字段 表单字段
AutoField Form中不显示
BigAutoField Form中不显示
BigIntegerField IntegerField,最小-9223372036854775808,最大9223372036854775807
BooleanField BooleanField
CharField CharField,同样的最大长度限制,如果model设置了null=True,form将使用empty_value
CommaSeparatedIntegerField CharField
DateField DateField
DateTimeField DateTimeField
DecimalField DecimalField
EmailField EmailField
FileField FileField
FilePathField FilPathField
FloatField FloatField
ForeignKey ModelChoiceField
ImageField ImageField
IntegerField IntegerField
IPADddressField IPAddressField
GenericIPAddressField GenericIPAddressField
ManyToManyField ModelMultipleChoiceField
NullBooleanField NullBooleanField
PositiveIntegerField IntegerField
PositiveSmallIntegerField IntegerField
SlugField SlugField
SmallIntegerField IntegerField
TextField CharField,并带有widget=forms.Textarea参数
TimeField TimeField
URLField URLField

Django的模型字段和表单字段在设计有很多的相同之处。

ManyToManyField 和 ForeignKey

  • ForeignKey被映射为表单的django.forms.ModelChoiceField,它的选项是一个模型的QuerySet,也就是可以选择的对象的列表,但是只能选择一个;ManyToManyField被映射为表单的django.forms.ModelMultipleChoiceField,它的选项也是一个模型的QuerySet,也是可以选择的对象的列表,但是可以同时选择多个。
  • 如果模型字段设置blank=True,那么字段的required将被设置为False,否则required将被设置为True。
  • 表单字段的label属性根据模型字段的verbose_name属性设置。
  • 如果模型的某个字段设置了editable=False属性,那么它在表单类中将不会出现。
  • 表单字段的help_text设置为模型字段的help_text。
  • 如果模型字段设置了choices参数,那么表单字段的widget属性将被设置成Select框,选项来自模型字段的choices。选单种通常会包含一个空选项,作为默认选项。如果该字段是必选的,它会强制用户选择一个选项。如果模型字段具有default参数,则不会添加空选项到选单中。

ModelForm的验证

  1. 验证表单
  2. 验证模型实例

ModelForm的字段选择

  1. 使用fields,选择表单需要使用到的字段。如果需要把所有的字段都添加,可以是用__all__
    示例:
    ```python
    from django.forms import ModelForm

class AuthorForm(ModelForm):
class Meta:
model = Author
fields = ‘all

2.使用exclude,列出不需要使用到的字段。
```python
class PartialAuthorForm(ModelForm):
    class Meta:
        model = Author
        exclude = ['title']

通过元类修改ModelForm字段的属性

修改样式

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}), # 关键是这一行
        }

添加error_message, help_text和labels属性

from django.utils.translation import ugettext_lazy as _

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title', 'birth_date')
        labels = {
            'name': _('Writer'),
        }
        help_texts = {
            'name': _('Some useful help text.'),
        }
        error_messages = {
            'name': {
                'max_length': _("This writer's name is too long."),
            },
        }

使用自定义表单字段

# 假设MySlugFormField为自定义字段
from django.forms import ModelForm
from myapp.models import Article

class ArticleForm(ModelForm):
    class Meta:
        model = Article
        fields = ['pub_date', 'headline', 'content', 'reporter', 'slug']
        field_classes = {
            'slug': MySlugFormField,
        }

指定字段验证器

from django.forms import ModelForm, CharField
from myapp.models import Article

class ArticleForm(ModelForm):
    slug = CharField(validators=[validate_slug])

    class Meta:
        model = Article
        fields = ['pub_date', 'headline', 'content', 'reporter', 'slug']

启用字段本地化

默认情况下,ModelForm中的字段不会本地化它们的数据,可以使用localized_fields属性来启用。

>>> from django.forms import ModelForm
>>> from myapp.models import Author
>>> class AuthorForm(ModelForm):
...     class Meta:
...         model = Author
...         localized_fields = ('birth_date',)
0条评论

相关推荐

django教程

r

Django 2019-05-20 10:53:53

Celery

celery学习资料

Django 2019-05-25 18:41:55

Django-rest-framework教程

django-rest-framework教程。

Django 2019-07-18 16:33:26

django实用资料

django项目从0到1自己总结的实用的资料,大部分常用的功能这里都有

Django 2019-05-08 18:21:34