2009-12-16 69 views
3

对不起,对一个新手问题,但...Django inlineformsetfactory - 它有什么好处?

有人可以澄清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会显示Book form,内嵌作者表单,像Django Admin一样只有 。最重要的是,我不能轻易地将初始值传递给formset?

那么使用两个独立的AuthorForm和BookForm怎么样?

或者我错过了明显的东西?

回答

1

inlineformset_factory(和modelformset_factory)的美妙之处在于能够从单一表单创建多个模型实例。如果你只是“使用两个单独的表单”,那么表单域的id就会互相践踏。

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

+0

所以,如果我理解正确inlineformset_factory只是“规模”更好。但我仍然可以在“常规”形式中指定前缀以防止id冲突 – Mike 2009-12-16 19:50:34

2

inlineformset_factory只为嵌套元素提供了多种形式,如果需要主模型的表单,则顶部需要单独的表单。

下面是一个例子的工作inlineformset_factory具有嵌入在顶部的主要形式:

views.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)) 

template.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 %} 
1

inlineformset_factory创建的表单列表。

这时候可以使用相同的形式需要在页面重复,例如:

  • 上传多个照片与说明。
  • 通过电子邮件
  • 邀请多个成员填写每小时
  • 日历网格填充的书籍的作者名单。

对于一些JavaScript代码,您还可以添加“添加另一行”功能。