2011-08-24 42 views
1

型號:Django的:對於formset_factory表單元素設置默認值

class AssociatedFileCourse(models.Model) 
    file_original = models.FileField(upload_to = 'assets/associated_files') 
    session = models.ForeignKey(Session) 
    title = models.CharField(max_length=500) 

形式:

class AddAssociatedFilesForm(ModelForm): 
    class Meta: 
    model = AssociatedFileCourse 

如果我不得不從上面認定中創建一個單一的形式,並設置一些初始值,它可以有使用初始參數一樣

form = AddAssociatedFilesForm(initial={'session': Session.objects.get(pk=id)})

浩做w至創建formset_factory形式像時設置的初始形式值:

AddAssociatedFilesFormSet = formset_factory(AddAssociatedFilesForm) 
form = AddAssociatedFilesFormSet() 

回答

1

你想用modelformset_factory,這是專爲創建和模型實例的表單集行爲。

from django.forms.models import modelformset_factory 

# create the formset by specifying the Model and Form to use 
AddAssociatedFilesFormSet = modelformset_factory(AssociatedFileCourse, form=AddAssociatedFilesForm) 

# Because you aren't doing anything special with your custom form, 
# you don't even need to define your own Form class 
AddAssociatedFilesFormSet = modelformset_factory(AssociatedFileCourse) 

默認情況下,模型formset將顯示每個Model實例的表單 - 即Model.objects.all()。另外,您還可以使用空白表格來創建新的模型實例。空白表格的數量取決於傳遞給modelformset_factory()的max_numextra kwargs。

如果您需要初始數據,您可以在生成formset時將其指定爲initial kwarg。請注意,初始數據需要在列表中。

formset = AddAssociatedFilesFormSet(queryset=AssociatedFileCourse.objects.none(), 
            initial=[{'session': Session.objects.get(pk=id)}]) 

這應該看起來像你想要它。但是,您不能(至少在當前的Django版本中)使用現有的模型實例創建extra表單的初始數據。這就是爲什麼objects.none()查詢集在那裏。將其設置爲objects.all()或刪除queryset kwarg並且 - 如果有實例 - 額外的表單將不具有初始數據。

進一步閱讀帶有初始數據的模型套件 - 請參閱此post

1

你會做同樣的方式,除了在字典中,而不僅僅是一個值,使用值的列表。

Django docs on formsets

>>> ArticleFormSet = formset_factory(ArticleForm, extra=2) 
>>> formset = ArticleFormSet(initial=[ 
...  {'title': u'Django is now open source', 
...  'pub_date': datetime.date.today()}, 
... ]) 

>>> for form in formset: 
...  print form.as_table() 
<tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" value="Django is now open source" id="id_form-0-title" /></td></tr> 
<tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" value="2008-05-12" id="id_form-0-pub_date" /></td></tr> 
<tr><th><label for="id_form-1-title">Title:</label></th><td><input type="text" name="form-1-title" id="id_form-1-title" /></td></tr> 
<tr><th><label for="id_form-1-pub_date">Pub date:</label></th><td><input type="text" name="form-1-pub_date" id="id_form-1-pub_date" /></td></tr> 
<tr><th><label for="id_form-2-title">Title:</label></th><td><input type="text" name="form-2-title" id="id_form-2-title" /></td></tr> 
<tr><th><label for="id_form-2-pub_date">Pub date:</label></th><td><input type="text" name="form-2-pub_date" id="id_form-2-pub_date" /></td></tr>