【问题标题】:Django InlineModelAdmin gives error 'MediaDefiningClass' object is not iterableDjango InlineModelAdmin 给出错误“MediaDefiningClass”对象不可迭代
【发布时间】:2017-06-12 05:18:57
【问题描述】:

来自models.py

class Indicator(models.Model):
    name = models.CharField(max_length=50)
    youtube = models.CharField(max_length=LONG_BLOG_POST_CHAR_LEN)
    description = models.CharField(max_length=LONG_BLOG_POST_CHAR_LEN)    
    recommendation = models.CharField(max_length=LONG_BLOG_POST_CHAR_LEN)
    isPublic = models.BooleanField(default=False)
    methods_path = models.CharField(max_length=100,default=None)
    meta_description = models.CharField(max_length=150,default='')
    image_path = models.CharField(max_length=100,blank=True)

    def __str__(self):
        return self.name   

class IndicatorParameterInt(models.Model):
    name = models.CharField(max_length=50)
    value = models.IntegerField(default=1)
    indicator_int_parameter = models.ForeignKey(Indicator, on_delete=models.CASCADE)
    hidden = models.BooleanField(default=False)

class IndicatorParameterFloat(models.Model):
    name = models.CharField(max_length=50)
    setting = models.FloatField(default=1)
    indicator_float_parameter = models.ForeignKey(Indicator, on_delete=models.CASCADE)
    hidden = models.BooleanField(default=False)

class Comparison(models.Model):
    name = models.CharField(max_length=100)

来自 admin.py

from django.contrib import admin
from .models import *

# Register your models here.
admin.site.register( MarketData )
admin.site.register( Indicator )
admin.site.register( UserProfile )



class IndicatorParameterIntInline(admin.TabularInline):
    model = IndicatorParameterInt
    fk_name = "indicator_int_parameter"

class IndicatorParameterFloatInline(admin.TabularInline):
    model = IndicatorParameterFloat
    fk_name = "indicator_float_parameter"   

class ComparisonInline(admin.TabularInline):
    model = Comparison
    fk_name = "Comparison"  

class IndicatorInline(admin.ModelAdmin):
    inlines = [ 
                IndicatorParameterIntInline,
                IndicatorParameterFloatInline,
                ComparisonInline, 
              ]

admin.site.unregister( Indicator )
admin.site.register( IndicatorInline )

错误 TypeError: 'MediaDefiningClass' object is not iterable 出现在 admin 的最后一行:admin.site.register( IndicatorInline )。如果我尝试先注册 IndicatorInline 或任何外键类都没关系。

我引用了this post,它鼓励使用 fk_name 属性。无论我是否使用 fk_name,都会发生错误。

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    注册模型管理类时需要指定模型。

    admin.site.register(Indicator, IndicatorInline)
    

    请注意,如果您从模块顶部删除 admin.site.register( Indicator ),则以后不必再调用 admin.site.unregister(Indicator)

    我建议重命名 IndicatorInline - 这是一个具有内联功能的模型管理员,因此最好将其命名为 IndicatorAdmin。在这种情况下,您可以通过以下方式注册它:

    admin.site.register(Indicator, IndicatorAdmin)
    

    【讨论】:

    • @surfer190 我不确定你的意思。这个答案不应该与 Django 文档冲突。
    【解决方案2】:

    首先,尽量不要使用import * - 始终导入您正在使用的模型。

    接下来,我觉得改变这个应该就够了

    from django.contrib import admin
    from .models import *
    
    
    
    
    
    class IndicatorParameterIntInline(admin.TabularInline):
        model = IndicatorParameterInt
        fk_name = "indicator_int_parameter"
    
    class IndicatorParameterFloatInline(admin.TabularInline):
        model = IndicatorParameterFloat
        fk_name = "indicator_float_parameter"   
    
    class ComparisonInline(admin.TabularInline):
        model = Comparison
        fk_name = "Comparison"  
    
    class IndicatorInline(admin.ModelAdmin):
        inlines = [ 
                    IndicatorParameterIntInline,
                    IndicatorParameterFloatInline,
                    ComparisonInline, 
                  ]
    
    admin.site.register(Indicator, IndicatorInline)
    admin.site.register(MarketData, )
    admin.site.register(UserProfile, )
    

    【讨论】:

    • 谢谢!为什么同时注册模型和内联类是让它快乐的唯一方法?
    • 你总是需要用你的管理员模型注册你的模型。这就是你告诉你的 django 管理员它必须使用这个特定的 ModelAdmin 的方式。因为如您所见,您的 IndicatorInline 中没有关于模型的信息。
    猜你喜欢
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2018-02-02
    • 2013-12-01
    • 2021-08-21
    • 2012-01-20
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多