【问题标题】:Django admin model Inheritance is it possible?Django 管理模型继承是否可能?
【发布时间】:2011-11-14 14:55:28
【问题描述】:

管理模型中是否可以继承?

例如考虑以下,

文件:models.py

class AbstractModel ( models.Model ):
    # Meta Information common to all classes
    author = models.ForeignKey(auth.models.User , null = False ,related_name="%(class)s_related_author" ) # The user who created 
    editor = models.ForeignKey(auth.models.User , null = True,related_name="%(class)s_related_editor" ) # The user who last edited                   
    created_at = models.DateTimeField(auto_now_add  = True) # Create Time
    edited_at = models.DateTimeField(auto_now = True) # Modify Time

    class Meta:
                abstract = True


class Topic( AbstractModel ):
    name = models.CharField(max_length = NameMaxLength , unique = True)
    version_number = models.IntegerField(default = 0)
    update_frequency = models.IntegerField()

ModelAdmin 中使用时,类似的继承似乎不会产生正确的结果

文件:admin.py

class Abstract_Admin_Model( admin.ModelAdmin ):
        fields =  ('author' , 'editor' , 'created_at' , 'edited_at')
        readonly_fields = ('author' , 'editor' , 'created_at' , 'edited_at')

        def save_model(self, request, obj, form, change):
                if not change :
                        obj.author = request.user
                else : 
                        obj.editor = request.user
                obj.save()

class Admin_Topic( Abstract_Admin_Model ):
     fields += ('name' , 'version_number' , 'update_frequency')


admin.site.register( Topic , Admin_Topic )

编辑

我根据建议修改了上面的模型,

如果admin.py 是这样的,我没有收到任何错误,并且模型出现在管理员上。

class AbstractAdminModel(  admin.ModelAdmin  ):
        pass#fields = ['author' , 'editor' , 'created_at' , 'edited_at']


class Admin_Topic( AbstractAdminModel ):
    pass

admin.site.register( Topic , Admin_Topic )

但是如果我这样修改它

class AbstractAdminModel(  admin.ModelAdmin  ):
    fields = ['author' , 'editor' , 'created_at' , 'edited_at']


class Admin_Topic( AbstractAdminModel ):
    pass

admin.site.register( Topic , Admin_Topic )

我收到以下错误:

这是一个堆栈跟踪Link

问题: 该模型甚至没有出现在管理页面上

额外信息:

使用 django 1.2.5 和 pinax 0.7.2、Ubuntu 11.04、python 2.7.1+

【问题讨论】:

    标签: python django django-models django-admin pinax


    【解决方案1】:

    也许你的答案有点晚了,但我认为其他人可能会遇到类似的问题 - 就像我一样。

    这是我的解决方案 - 我不确定它是否合适,但它对我有用,而且上面的其他人也可以这样做(假设你想要一个多表继承(非抽象模型),就像我一样)

    class SiteEntityAdmin(admin.ModelAdmin):
        fieldsets = [
                (None, {'fields': ['name']}),
        ]
    
    
    class PhotoAdmin(SiteEntityAdmin):
        fieldsets = [
                 ('Photo details', {'fields': ['photo_url', 'description']}),
        ]
        fieldsets.insert(0, SiteEntityAdmin.fieldsets[0])
    

    【讨论】:

      【解决方案2】:

      是的,这是可能的。我认为您所做的错误是:

      class Meta:
          abstract = True
      

      在您的Abstract_Admin_Model 班级中。尝试不使用 Meta 类。

      【讨论】:

      • 实际上没有任何区别
      • 你确定你的APP在settings.py的INSTALLED_APPS中有吗?如果在没有继承的情况下尝试您的Admin_Topic 是否有效?
      • 我很确定该应用程序已安装,因为它在我创建抽象类并尝试继承它之前工作
      • 只是猜测,可能问题出在fields += ...。尝试以下方式:fields = Abstract_Admin_Model.fields + (...)。
      • 你知道,admin.ModelAdmin只是一个普通的python类(不像Model类有很多Meta在里面工作),所以正常的继承工作正常(没有任何用处Meta 类)。如果它对您不起作用,则问题不在于继承(您已经从 admin.ModelAdmin 继承!)因此您需要在其他地方检查它。
      【解决方案3】:

      要使用父类的类属性,例如list_displaysearch_fields,您可以执行以下操作:

      @admin.register(BaseClass)
      class BaseClassAdmin(admin.ModelAdmin):
          list_display = ('field_a', 'field_b')
          search_fields = ('field_a', 'field_b')
      
      @admin.register(ChildClass)
      class ChildClassAdmin(BaseClassAdmin):
          def get_list_display(self, request):
              return self.list_display + ('field_c', 'field_d')
      
          def get_search_fields(self, request):
              return self.search_fields + ('field_c', 'field_d')
      

      类似地,您可以对 actionsreadonly_fields 等其他属性执行此操作。

      【讨论】:

        【解决方案4】:

        问题出在这里:

        class Admin_Topic( admin.ModelAdmin ):
        

        这一行控制继承,所以应该是:

        class Admin_Topic( Abstract_Admin_Model ):
        

        另外值得注意的是:您可能希望使用TopicAdmin 而不是Admin_Topic 以更好地匹配 Django 约定。

        【讨论】:

        • 对不起,由于代码中的意外错误,我已经编辑了代码,即使那样也不起作用
        • 很抱歉,您在更改后是否重新启动了 Web 服务?
        • :-),我做到了,我在编辑时 Web 服务正在运行,我也尝试重新启动它
        【解决方案5】:

        尝试改变:

            class Meta:
                abstract = True
        

            class Meta:
                model = Topic
                abstract = True
        

        【讨论】:

          【解决方案6】:

          修改后的 admin.py 中的继承有效。 问题是您将字段“created_at”添加到管理员(Admin_RSSFeed), 但它在模型上不存在(可能命名为 RSSFeed?)。 (至少这是错误截图试图告诉你的。)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-06-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多