In a formset in Django, how do we set a default value for a field which needs a value from the http session? Since a session is required to get the value, we cannot set a default value in the model class itself. And I am not able to understand how to explicitly set the value in each form in the formset before saving in the view fu开发者_如何学Pythonnction.
Setting the initial attribute in the construction of the FormSet would work but for whatever reason, I get a compilation error. The code is like this:
formset = LineItemsInlineFormSet(initial=[{'updated_by':'user'}])
The compilation error is: init() got an unexpected keyword argument 'initial'
I am using Django 1.1.1
Any insight will be appreciated. Thanks in Advance.
The idiom to instance a formset with initial data is:
data = {
'form-TOTAL_FORMS': u'2',
'form-INITIAL_FORMS': u'0',
'form-MAX_NUM_FORMS': u'',
'form-0-updated_by': u'user',
'form-1-updated_by': u'user',
}
formset = LineItemsInlineFormSet(data)
Update:
As Jonny Buchanan noted, this approach gives you a bound formset, which will display validation errors if all required data is not provided. If it is not what you want, create your formset passing a custom Form with desired settings to django.forms.formsets.formset_factory()
.
It is common to set updated_by
as the current logged-in user automagically upon update. If this is what you want:
- omit the
updated_by
field in the form; save()
withcommit=False
if it is a ModelFormset;- set
updated_by
to current user; and - save object instances, now with the default
commit=True
.
In the admin site there is a convenient way to do this with inlines: overrride ModelAdmin.save_formset.
精彩评论