管理模型中是否可以继承?
与示例相同,请考虑以下内容,
档案: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 +
答案 0 :(得分:4)
也许你的答案有点迟,但我认为其他人可能会遇到类似的问题 - 就像我一样。
这是我的解决方案 - 我不确定它是否合适,但它适用于我而非上述其他人可以做同样的事情(假设您需要多重继承(非抽象模型),就像我一样)< / p>
class SiteEntityAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['name']}),
]
class PhotoAdmin(SiteEntityAdmin):
fieldsets = [
('Photo details', {'fields': ['photo_url', 'description']}),
]
fieldsets.insert(0, SiteEntityAdmin.fieldsets[0])
答案 1 :(得分:3)
是的,这是可能的。我认为你所犯的错误就是:
class Meta:
abstract = True
在您的Abstract_Admin_Model
课程中。尝试不使用Meta
类。
答案 2 :(得分:1)
问题在于:
class Admin_Topic( admin.ModelAdmin ):
这一行控制继承,因此它应该是:
class Admin_Topic( Abstract_Admin_Model ):
另外值得注意的是:您可能希望使用TopicAdmin
而不是Admin_Topic
来更好地匹配Django约定。
答案 3 :(得分:0)
尝试更改:
class Meta:
abstract = True
到
class Meta:
model = Topic
abstract = True
答案 4 :(得分:0)
修改后的admin.py中的继承有效。 问题是您要将“created_at”字段添加到管理员(Admin_RSSFeed), 但它在模型上不存在(可能名为RSSFeed?)。 (至少这是错误截图试图告诉你的。)
答案 5 :(得分:0)
要使用父级的类属性,例如list_display
或search_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
等其他属性执行此操作。