How to set default values ​​in TabularInline form set in Django admin

How to set first lines / defaults in django admin inline?

class Employee(models.Model): username = models.CharField(_('Username'), max_length=150, null=False, blank=False) email = models.CharField(_('Email'), max_length=150, null=False, blank=False) class Details(models.Model): employee = models.ForeignKey(Employee, verbose_name=_('Employee'), blank=False, null=False) label = models.CharField(_('Label'), max_length=150, null=False, blank=False) value = models.CharField(_('Value'), max_length=150, null=False, blank=False) class DetailsFormset(forms.models.BaseInlineFormSet): def __init__(self, *args, **kwargs): self.initial = [ { 'label': 'first name'}, {'label': 'last name'}, {'label': 'job',}] super(DetailsFormset, self).__init__(*args, **kwargs) class DetailsInline(admin.TabularInline): model = Details formset = DetailsFormset fieldsets = [ ['', {'fields': ['employee', 'label', 'value']}] ] class EmployeeAdmin(admin.ModelAdmin): inlines = [DetailsInline] 

but this line does not work

  self.initial = [ { 'label': 'first name'}, {'label': 'last name'}, {'label': 'job',}] 

How to set default values ​​using django admin?

+8
django django-admin django-forms
source share
2 answers
 from django.utils.functional import curry class DetailsInline(admin.TabularInline): model = Details formset = DetailsFormset extra = 3 def get_formset(self, request, obj=None, **kwargs): initial = [] if request.method == "GET": initial.append({ 'label': 'first name', }) formset = super(DetailsInline, self).get_formset(request, obj, **kwargs) formset.__init__ = curry(formset.__init__, initial=initial) return formset 

From here: Pre-populate the embedded FormSet?

+9
source share

If you need to specify default values ​​for creating new forms, you can override the empty_form property of the empty_form object:

 class MyDefaultFormSet(django.forms.models.BaseInlineFormSet): @property: def empty_form(self): form = super(MyDefaultFormSet, self).empty_form # you can access self.instance to get the model parent object form.fields['label'].initial = 'first name' # ... return form class DetailsInline(admin.TabularInline): formset = MyDefaultFormSet 

Now, every time you add a new form, it contains the source data that you provided. I tested this on django 1.5.

+2
source share

All Articles