4

对不起,一个新手问题,但......

有人可以阐明 inlineformset_factory 的用例是什么吗?

我遵循了 Django 文档中的示例:

#Models
class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    author = models.ForeignKey(Author)
    title = models.CharField(max_length=100)

#View

def jojo(request):

    BookFormSet = inlineformset_factory(Author, Book)
    author = Author.objects.get(name=u'Mike Royko')
    formset = BookFormSet(instance=author)


    return render_to_response('jojo.html', {
        'formset': formset,
    })

#jojo.html
<form action="" method="POST">
<table>

{{ formset }}

</table>
<input type="submit" value="Submit" />
</form>

但它只显示书籍字段。

我的理解是 formset 会像 Django Admin 一样显示带有内联 Author 表单的 Book 表单。最重要的是,我不能轻易地将初始值传递给表单集?

那么使用两个单独的 AuthorForm 和 BookForm 有什么好处呢?

还是我错过了一些明显的东西?

4

3 回答 3

3

inlineformset_factory 只为嵌套元素提供多个表单,如果您想要主模型的表单,则需要在顶部提供一个单独的表单。

这是一个工作 inlineformset_factory 的示例,主窗体嵌入在顶部:

视图.py

from django.shortcuts import get_object_or_404, render_to_response
from django.forms.models import inlineformset_factory
from django.http import HttpResponseRedirect
from django.template import RequestContext

from App_name.models import * #E.g. Main, Nested, MainForm, etc.

. . .

@login_required
def Some_view(request, main_id=None, redirect_notice=None):
    #login stuff . . .
    c = {}
    c.update(csrf(request))
    c.update({'redirect_notice':redirect_notice})#Redirect notice is an optional argument I use to send user certain notifications, unrelated to this inlineformset_factory example, but useful.

    #Intialization --- The start of the view specific functions
    NestedFormset = inlineformset_factory(Main, Nested, can_delete=False, )
    main = None
    if main_id :
        main = Main.objects.get(id=main_id)#get_object_or_404 is also an option

    # Save new/edited Forms
    if request.method == 'POST':
        main_form = MainForm(request.POST, instance=main, prefix='mains')
        formset = NestedFormset(request.POST, request.FILES, instance=main, prefix='nesteds')
        if main_form.is_valid() and formset.is_valid():
            r = main_form.save(commit=False)
            #do stuff, e.g. setting any values excluded in the MainForm
            formset.save()
            r.save()
            return HttpResponseRedirect('/Home_url/')
    else:
        main_form = MainForm(instance=main, prefix='mains') #initial can be used in the MainForm here like normal.
        formset = NestedFormset(instance=main, prefix='nesteds')
    c.update({'main_form':main_form, 'formset':formset, 'realm':realm, 'main_id':main_id})
    return render_to_response('App_name/Main_nesteds.html', c, context_instance=RequestContext(request))

模板.html

{% if main_form %}
<form action="." method="POST">{% csrf_token %}
    {{ formset.management_form }}
    <table>
        {{main_form.as_table}}
        {% for form in formset.forms %}
            <table>{{ form }}</table>
        {% endfor %}
    </table>
    <p><input type="submit" name="submit" value="Submit" class="button"></p>
</form>
{% endif %}
于 2012-03-28T20:18:51.360 回答
2

inlineformset_factory(and )的美妙之处modelformset_factory在于能够从单个表单创建多个模型实例。如果您要简单地“使用两个单独的表单”,则表单字段的 id 会相互践踏。

formset_factory 函数知道您需要多少额外的表单(集)(通过额外的参数)并相应地设置字段的 id。

于 2009-12-16T14:03:59.967 回答
2

inlineformset_factory创建表单列表。

当需要在页面上重复相同的表单时,可以使用此方法,例如:

  • 上传多张带有描述的照片。
  • 通过电子邮件邀请多个成员
  • 每小时填充一个日历网格
  • 为作者填写书籍清单。

使用一些 JavaScript 代码,您也可以添加“添加另一行”功能。

于 2012-06-19T14:01:54.403 回答