将参数传递给 django admin 中的内联表单

Osc*_*son 3 django django-forms django-admin

我有一个从 ModelAdmin 继承的管理类:

class TemplateAdmin (admin.ModelAdmin):
    inlines = (TemplateAttributeInline, CompanyAttributeInline)
    list_display = ("name", "created", "updated","departments")
    list_filter = ['companies__company']
    list_editable = ("departments",)
    search_fields = ("name", "companies__company",)
    exclude = ("companies",)
    save_as = True
Run Code Online (Sandbox Code Playgroud)

我想传递一个参数,TemplateAttributeInline然后将参数传递给TemplateAttributeForm. 做这个的最好方式是什么?

模板属性内联:

class TemplateAttributeInline (admin.TabularInline):
    model = TemplateAttribute
    extra = 0
    sortable_field_name = "display"
    form = TemplateAttributeForm
Run Code Online (Sandbox Code Playgroud)

模板属性表单

class TemplateAttributeForm(forms.ModelForm):
    class Meta:
        model = Template
    def __init__(self,*args, **kwargs):
        super(TemplateAttributeForm, self).__init__(*args, **kwargs) 
        self.fields['attribute'].queryset = Attribute.objects.filter(#WANT TO FILTER BY THE ID OF THE COMPANY THAT OWNS THE TEMPLATE WE ARE EDITING ON THE ADMIN PAGE)
Run Code Online (Sandbox Code Playgroud)

小智 7

您可以创建一个返回表单类的函数:

def TemplateAttributeForm(param):

    class MyTemplateAttributeForm(forms.ModelForm):
        class Meta:
            model = Template
        def __init__(self,*args, **kwargs):
            super(TemplateAttributeForm, self).__init__(*args, **kwargs) 
            #do what ever you want with param

    return MyTemplateAttributeForm
Run Code Online (Sandbox Code Playgroud)

在另一个函数中使用它来定义 TemplateAttributeInline

def TemplateAttributeInline(param):

        class MyTemplateAttributeInline (admin.TabularInline):
            model = TemplateAttribute
            extra = 0
            sortable_field_name = "display"
            form = TemplateAttributeForm(param)

        return MyTemplateAttributeInline 
Run Code Online (Sandbox Code Playgroud)

最后,在你的TemplateAdmin定义中使用这个函数:

class TemplateAdmin (admin.ModelAdmin):
    inlines = (TemplateAttributeInline(param), CompanyAttributeInline)
    ....
Run Code Online (Sandbox Code Playgroud)