【问题标题】:Passing parameters to inline form in django admin在 django admin 中将参数传递给内联表单
【发布时间】:2015-08-27 02:23:19
【问题描述】:

我有一个继承自 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

我想将参数传递给TemplateAttributeInline,然后它会将参数传递给TemplateAttributeForm。最好的方法是什么?

模板属性内联:

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

模板属性表单

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)

【问题讨论】:

    标签: django django-forms django-admin


    【解决方案1】:

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

    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
    

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

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

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

    class TemplateAdmin (admin.ModelAdmin):
        inlines = (TemplateAttributeInline(param), CompanyAttributeInline)
        ....
    

    【讨论】:

    • 对我想要它做的事情不太有效,但可以作为被接受的问题的答案
    【解决方案2】:

    为了补充Sylvain Biehler 的响应,我添加了以下代码以使内联表单动态化。这是django doc 的参考资料。方法“get_inline_instances”在第一次“加载”、“保存”之后和“重新加载”时调用。在“添加”事件中,None 被传递。

    这里,“obj”是管理表单当前绑定到的模型实例。未绑定(添加新)表单为“无”。您可以传递它的任何属性,而不是直接传递模型实例“obj”,例如对象 ID。在这种情况下,需要先检查实例是否为None。

    class TemplateAdmin (admin.ModelAdmin):
       ...
       inlines = (TemplateAttributeInline(param), CompanyAttributeInline)
       ...
       def get_inline_instances(self, request, obj=None): 
         return  [
             TemplateAttributeInline(obj)(self.model, self.admin_site), 
             CompanyAttributeInline(self.model, self.admin_site), 
           ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-10
      • 2020-04-13
      • 2021-10-15
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 2016-12-13
      • 2018-12-11
      相关资源
      最近更新 更多