7

在管理模型中可以继承吗?

例如,考虑以下内容,

文件 :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 )

我收到以下错误:

错误

这是一个堆栈跟踪链接

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

额外信息:

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

4

6 回答 6

8

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

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

class SiteEntityAdmin(admin.ModelAdmin):
    fieldsets = [
            (None, {'fields': ['name']}),
    ]


class PhotoAdmin(SiteEntityAdmin):
    fieldsets = [
             ('Photo details', {'fields': ['photo_url', 'description']}),
    ]
    fieldsets.insert(0, SiteEntityAdmin.fieldsets[0])
于 2011-11-19T21:11:58.930 回答
4

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

class Meta:
    abstract = True

在你的Abstract_Admin_Model课上。尝试不Meta上课。

于 2011-09-11T03:33:03.277 回答
3

要使用父类的类属性,例如list_displayorsearch_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')

同样,您可以对其他属性(如actions,readonly_fields等)执行此操作。

于 2019-10-31T16:52:59.320 回答
1

问题在这里:

class Admin_Topic( admin.ModelAdmin ):

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

class Admin_Topic( Abstract_Admin_Model ):

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

于 2011-09-11T03:38:57.093 回答
0

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

于 2014-04-07T04:48:53.963 回答
0

尝试改变:

    class Meta:
        abstract = True

    class Meta:
        model = Topic
        abstract = True
于 2011-09-11T04:10:07.317 回答