Django的ModelForm的一些用法

1.save()方法

save() 方法接受一个可选参数 commit ,它的值是 True 或者 False 。如果调用 save() 的时候使用 commit=False ,那么它会返回一个尚未保存到数据库的对象。在这种情况下,需要您自己在生成的模型实例上调用 save() 。如果要在保存对象之前对对象执行自定义操作,或者要使用其中一个专用的 模型保存选项 ,这很有用。 commit 的值默认为 True 。

另一个使用 commit=False 的作用,您可以在模型与另一个模型有多对多关系的时候看到。如果您的模型具有多对多关系,并且在保存表单时指定了 commit=False ,Django无法立即保存多对多关系的表单数据。这是因为实例的多对多数据只有实例在数据库中存在时才能保存。

要解决这个问题,Django会在您每次使用 commit=False 保存表单时,向 ModelForm 子类添加一个 save_m2m() 方法。在您手动保存表单生成的实例后,可以调用 save_m2m() 来保存多对多的表单数据。

  1. # Create a form instance with POST data.
    >>> f = AuthorForm(request.POST)
    
    # Create, but don't save the new author instance.
    >>> new_author = f.save(commit=False)
    
    # Modify the author in some way.
    >>> new_author.some_field = 'some_value'
    
    # Save the new instance.
    >>> new_author.save()
    
    # Now, save the many-to-many data for the form.
    >>> f.save_m2m()

2.选择要使用的字段

将 fields 属性设置为特殊值 '__all__' 以表明需要使用模型中的所有字段

from django.forms import ModelForm

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = '__all__'

将 ModelForm 中Meta类的 exclude 属性设置为表单中需要排除的字段列表

class PartialAuthorForm(ModelForm):
    class Meta:
        model = Author
        exclude = ['title']

Django有个规则:如果您在模型字段中定义了 editable=False , *任何*使用 ModelForm 给该模型创建的表单都不会包含这个字段。

3.启用对字段的本地化

默认情况下, ModelForm 中的字段不会本地化他们的数据。要为字段启用本地化,您可以在 Meta 类中使用 localized_fields 属性。

如果 localized_fields 设置为特殊值 '__all__' ,则所有字段都将被本地化。

4.提供初始值

与普通表单一样,可以在实例化表单时通过指定 initial 参数来指定表单的初始值。以这种方式提供的初始值会覆盖表单字段的初始值以及对应模型实例的初始值。例如:

>>> article = Article.objects.get(pk=1)
>>> article.headline
'My headline'
>>> form = ArticleForm(initial={'headline': 'Initial headline'}, instance=article)
>>> form['headline'].value()
'Initial headline'

 

你可能感兴趣的:(django项目经验之谈)