2009-12-16 36 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代碼,您還可以添加「添加另一行」功能。