如何在Django admin中设置TableLine formset中的默认值

如何在Django admin中设置TableLine formset中的默认值,django,django-forms,django-admin,Django,Django Forms,Django Admin,如何在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) cla

如何在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设置默认值

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

从此处开始:

如果需要为创建的新表单定义默认值,则可以重新定义
InlineFormSet
empty\u form
属性:

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

现在,每次添加新表单时,它都包含您提供给它的初始数据。我已经在django 1.5上对此进行了测试。

为了为内联中的所有实例提供一个静态默认值,我找到了一个更简单的解决方案,只需将其设置为一个表单:

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'
字段的值不同,但我希望它对将来访问此页面的任何人都有用。

define
不起作用。结果是什么?我希望第一个默认行是firstname、lastname和job,但这不能定义任何默认值只是想提一下,对我来说,在模型上设置默认值要容易得多。我希望第一个默认行是firstname、lastname和job,但它总是设置相同的值,我需要定义三个内联行作为默认行,它们是staticOk,我将尝试在我的应用程序中进行测试。如果我解决了这个问题,我会发布我的答案。初始值显示在添加表单中,但是当单击“保存”时,值不会保存。这个问题的解决方案是什么?在Django 2.2中为我工作过。在我的例子中,我只需要非常新的表单上的初始数据(没有保存/链接对象),因此我最终将
if
条件修改为
if request.method==“GET”和(不是obj或不是obj.id):
。另外,如果添加初始数据是唯一的要求,则不需要在类下显式地提到
formset