我有一個模型formset,需要將關鍵字initial初始化爲(在formset中包含一些初始值,例如設置爲今天的日期)。據我所知,queryset參數(默認爲YourModel.objects.all())將覆蓋此功能以創建初始空表單。我將查詢集指定爲:YourModel.objects.none(),它阻止它使用數據庫中的條目填充表單集,但我仍然無法弄清楚如何有效地傳遞初始值。我是否需要從ModelForm中繼承一個方法?將初始值傳遞給Django的ModelFormSet
回答
一個簡單的解決方案可能是您將一個將modelform()擴展到formset(而不是modelformset)的窗體。
這樣你可以在窗體中設置初始值。
你能詳細說明一下嗎?我不確定我明白你的意思。 – Vince
我認爲你可以使用最初的說法,與普通表單集 http://docs.djangoproject.com/en/dev/topics/forms/formsets/#using-initial-data-with-a-formset
是的,如果它是一個常規的formset這是可能的。然而,這個formset是使用modelformset_factory()生成的。 – Vince
但仍可以通過最初的ModelFormSet。
from django.forms.models import modelformset_factory
from example.models import ExampleModel
ExampleModelFormSet = modelformset_factory(ExampleModel)
formset = ExampleModelFormSet(initial=[{'name': 'Some Name'},
{'name': 'Another Name'}])
如果這不是你以後的問題,你能解釋一下你的問題嗎?
編輯:
ExampleModelFormSet = modelformset_factory(ExampleModel, extra=2)
formset = ExampleModelFormSet(queryset=ExampleModel.objects.none(),
initial=[{'name': 'Some Name'},
{'name': 'Another Name'}])
默認情況下,Django的模型表單使用yourmodel.objects.all()的結果填充自己。這可以通過queryset = yourmodel.objects.none()來反轉,但這仍然不允許初始值。有關查詢集和初始關鍵字設置的事情使這不起作用。 – Vince
它不起作用,它不做什麼?通過使用更新後的代碼,我從一個空的查詢集中獲取一個formset並填入初始值。 – Gerry
是的..這是要走的路。我同意。 – simplyharsh
你傳遞一個空的查詢集來ModelFormset。
ExampleModelFormSet = modelformset_factory(ExampleModel, extra=2)
formset = ExampleModelFormSet(queryset=ExampleModel.objects.none(),
initial=[{'name': 'Some Name'},
{'name': 'Another Name'}])
這確實是實現你想要的方式。傳遞一個空的查詢集合是有意義的,否則初始值將覆蓋模型的數據庫值。
如果我想,你傳遞一個非空的查詢集,但又希望你的額外表單被填充將初始值,你可以覆蓋Formset
。
from django.forms.models import modelformset_factory
ExampleFormset = modelformset_factory(OpenIDProfile, extra=3)
class myFormset(ExampleFormset):
def _construct_form(self, i, **kwargs):
"""
Instantiates and returns the i-th form instance in a formset.
"""
if self.is_bound and i < self.initial_form_count():
pk_key = "%s-%s" % (self.add_prefix(i), self.model._meta.pk.name)
pk = self.data[pk_key]
pk_field = self.model._meta.pk
pk = pk_field.get_db_prep_lookup('exact', pk)
if isinstance(pk, list):
pk = pk[0]
kwargs['instance'] = self._existing_object(pk)
if i < self.initial_form_count() and not kwargs.get('instance'):
kwargs['instance'] = self.get_queryset()[i]
defaults = {'auto_id': self.auto_id, 'prefix': self.add_prefix(i)}
if self.data or self.files:
defaults['data'] = self.data
defaults['files'] = self.files
# Check to confirm we are not overwriting the database value.
if not i in range(self.initial_form_count()) and self.initial:
try:
defaults['initial'] = self.initial[i - self.initial_form_count()]
except IndexError:
pass
# Allow extra forms to be empty.
if i >= self.initial_form_count():
defaults['empty_permitted'] = True
defaults.update(kwargs)
form = self.form(**defaults)
self.add_fields(form, i)
return form
注意:initial
是字典列表。它希望列表中的項目完全等於額外的數量。
讓我在這裏的一個訣竅是,您必須設置額外的大於或等於您的初始數據中元素的數量。我知道這是你的答案,但我認爲這值得強調。 – Bacon
之後您可以更改初始數據。
例如:
# Construct the FormSet class
ExampleFormSet = modelformset_factory(ParentModel, ChildModel)
# Set the initial data
initial_data = {'field1': 1}
for form in ExampleFormSet.extra_forms:
for field in form.fields:
field.initial = initial_data[field.name]
當我嘗試(與formset_factory),我得到''str'對象沒有屬性'initial'' 我可能做錯了什麼? – LukasKawerau
@LukasKawerau:請檢查一下'form.fields'返回的內容。此代碼可能需要更正。 – vdboor
@LukasKawerau,在Python 2.7(至少)在字典上迭代只會獲得密鑰而不是數據 – maazza
新在Django 1.4 ...如果你現在只適用於「額外」的形式,而不是那些從查詢集綁定到一個實例設置modelformset初始:
https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#providing-initial-values
因此,上面的各種黑客不再需要,使用初始是答案。
在Django 1.4中,規則發生了變化:要顯示的首字母的數量對應於「額外」參數。 https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#providing-initial-values
在我的情況下初始參數的數量是動態變化的,所以 我發現下面的方法:
initial=[{'name': 'Some Name'},{'name': 'Another Name'}]
formset = ExampleModelFormSet(queryset=ExampleModel.objects.none(),
initial=initial, extra=len(initial))
class MyBaseFormSet(BaseModelFormSet):
def __init__(self, *args, **kwargs):
self.extra = kwargs.pop('extra', self.extra)
super(MyBaseFormSet, self).__init__(*args, **kwargs)
提供,ExampleModelFormSet基於MyBaseFormSet
簡單的方法如何通過初始具有相同計數的額外形式的數據:
MyModelFormSet = lambda *a, **kw: modelformset_factory(MyModel, extra=kw.pop('extra', 1))(*a, **kw)
用法i n個視點:
initial=[{'name': 'Some Name'},{'name': 'Another Name'}
formset = MyModelFormSet(queryset=MyModel.objects.none(), initial, extra=len(initial))})
Affter2天發現這一點:http://streamhacker.com/2010/03/01/django-model-formsets/
def custom_field_callback(field):
return field.formfield(required=False)
FormSet = modelformset_factory(model, formfield_callback=custom_field_callback)
def custom_field_callback(field):
if field.name == 'optional':
return field.formfield(required=False)
elif field.name == 'text':
return field.formfield(widget=Textarea)
elif field.name == 'integer':
return IntegerField()
else:
return field.formfield()
我發現要做到這一點,最好的辦法是隻手動調整初始化後該formset對象的「額外」的屬性。這已經過測試,並在Django 1.9中運行。
ExampleModelFormSet = modelformset_factory(ExampleModel, extra=1)
formset = ExampleModelFormSet(initial=[{'name': 'Some Name'},
{'name': 'Another Name'}])
formset.extra = 3
這將吐出3種形式(2個預填充和1個空白)。
如果你想要的東西更動態(例如initial
是別的地方計算的變量),你可以做這樣的事情:
ExampleModelFormSet = modelformset_factory(ExampleModel, extra=1)
formset = ExampleModelFormSet(initial=initial)
formset.extra += len(initial)
希望有所幫助。
- 1. 如何將FileField的初始值傳遞給Formset(在Django中)
- 2. 如何將初始參數傳遞給django的ModelForm實例?
- 3. Scala:將初始NULL傳遞給foldLeft
- 4. 將初始化列表傳遞給宏
- 5. 如何將初始值傳遞給使用Django-Userena的自定義窗體
- 6. 在ModelFormset中設置初始值
- 7. 使用manytomanyfield初始化modelformset
- 8. 將值傳遞給Django的形式
- 9. 如何將動態初始值傳遞給REDX形式
- 10. 將初始值傳遞給自定義輸入組件
- 11. iOS將屬性值傳遞給初始化視圖
- 12. 將值傳遞給Django模型屬性
- 13. 將多個起始值傳遞給nlminb
- 14. 作爲初始值的外鍵沒有傳遞給django中的ModelForm
- 15. 如何像一個初始值傳遞給的ImageField在Django形式
- 16. 將kwargs傳遞給Django Filter
- 17. 將MultiValueDict傳遞給Django ModelForm
- 18. Django將TemplateView傳遞給ModelAdmin.add_view
- 19. pyQt,列表傳遞給類初始化
- 20. 傳遞一個初始值到Django的表單字段
- 21. Django通過模型中的對象傳遞初始值
- 22. 如何將初始狀態傳遞給我的reducer?
- 23. C - 將未初始化的變量傳遞給函數
- 24. 將父類初始化變量傳遞給子類的實例
- 25. 將值傳遞給htaccess的
- 26. 將初始數據從django傳遞到角度2
- 27. 如何將初始表單上選定的值傳遞給主表單?
- 28. 將參數傳遞給腳本,得到:「使用未初始化的值$ ARGV [0]」
- 29. 在初始化方法中傳遞值
- 30. 初始數組對象和傳遞值
您想更改模型的特定實例,但不想顯示其現有值,而是顯示不同的初始值? –