如何在django admin的内联中设置第一个默认行/值?
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]
但这行不起作用
self.initial = [
{ 'label': 'first name'},
{'label': 'last name'},
{'label': 'job',}]
如何使用django admin设置默认值?
答案 0 :(得分:11)
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
答案 1 :(得分:3)
如果您需要为创建的新表单定义默认值,则可以重新定义empty_form
的{{1}}属性:
InlineFormSet
现在,每次添加新表单时,它都包含您提供的初始数据。我已经在django 1.5上测试了这个。
答案 2 :(得分:-2)
要为内联中的所有实例提供静态默认值,我找到了一个更简单的解决方案,只需将其设置为以下形式:
class DetailsForm(django_forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['label'] = 'first_name'
class DetailsInline(admin.TabularInline):
form = DetailsForm
# ...
我认为这不适用于OP的特殊情况,因为每种表单的'label'
字段具有不同的值,但我希望以后对进入此页面的任何人都有用。