zoukankan      html  css  js  c++  java
  • Django中创建基于数据模型的formset

    和模型表单对象一样,我们也可以通过数据模型来生成formset对象。比如:

    >>> from django.forms.models import modelformset_factory
    >>> AuthorFormSet = modelformset_factory(Author)

    通过模型对象生成的formset和普通的formset一样:

    >>> formset = AuthorFormSet()
    >>> print formset
    <input type="hidden" name="form-TOTAL_FORMS" value="1" id="id_form-TOTAL_FORMS" /><input type="hidden" name="form-INITIAL_FORMS" value="0" id="id_form-INITIAL_FORMS" /><input type="hidden" name="form-MAX_NUM_FORMS" id="id_form-MAX_NUM_FORMS" />
    <tr><th><label for="id_form-0-name">Name:</label></th><td><input id="id_form-0-name" type="text" name="form-0-name" maxlength="100" /></td></tr>
    <tr><th><label for="id_form-0-title">Title:</label></th><td><select name="form-0-title" id="id_form-0-title">
    <option value="" selected="selected">---------</option>
    <option value="MR">Mr.</option>
    <option value="MRS">Mrs.</option>
    <option value="MS">Ms.</option>
    </select></td></tr>
    <tr><th><label for="id_form-0-birth_date">Birth date:</label></th><td><input type="text" name="form-0-birth_date" id="id_form-0-birth_date" /><input type="hidden" name="form-0-id" id="id_form-0-id" /></td></tr>

    如果我们是基于模型对象创建的formset,那么我们可以利用模型对象的查询方法来定制formset包含的结果集。比如下面这样:

    >>> formset = AuthorFormSet(queryset=Author.objects.filter(name__startswith=’O’))

    或者,我们也可以自定义一个formset的子类,来重载其中的查询方法:

    from django.forms.models import BaseModelFormSet
    class BaseAuthorFormSet(BaseModelFormSet):
        def __init__(self, *args, **kwargs):
            super(BaseAuthorFormSet, self).__init__(*args, **kwargs)
            self.queryset = Author.objects.filter(name__startswith=’O’)

    然后将这个自定义类作为创建formset的一个参数:

    >>> AuthorFormSet = modelformset_factory(Author, formset=BaseAuthorFormSet)

    如果我们想创建一个不包含任何数据的空的formset,可以用下面的方法。

    >>> AuthorFormSet(queryset=Author.objects.none())

    和模型表单对象类似,我们可以通过fields和exclude方法来定义一个Formset中,包含哪些字段或者不包含哪些字段:

    >>> AuthorFormSet = modelformset_factory(Author, fields=(’name’, ’title’))
    >>> AuthorFormSet = modelformset_factory(Author, exclude=(’birth_date’,))

    模型表单对象中的save()方法可以将表单对象中的数据保存到数据库,同样的,formset对象也提供了一个save()方法,实现同样的功能:

    # Create a formset instance with POST data.
    >>> formset = AuthorFormSet(request.POST)
    # Assuming all is valid, save the data.
    >>> instances = formset.save()

    其他有关基于数据模型的formset的应用,比如在视图和模板对象中的使用等,与标准的formset相同,具体请参考:

     
     
  • 相关阅读:
    vijos1194 Domino
    vijos1603迷宫
    怎样实现App安装来源追踪
    怎样实现App安装来源追踪
    怎么在Chrome和Firefox浏览器中清除HSTS设置?
    怎么在Chrome和Firefox浏览器中清除HSTS设置?
    element UI排坑记(一):判断tabs组件是否切换
    ZooKeeper分布式锁的实现原理
    ZooKeeper分布式锁的实现原理
    TensorFlow框架 入门笔记
  • 原文地址:https://www.cnblogs.com/lddhbu/p/2628930.html
Copyright © 2011-2022 走看看