问题
Is inheritance possible in admin Models ?
Like For Example consider the following ,
File : 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()
A similar inheritance does not seem to produce the correct result when used in ModelAdmin
File : 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 )
EDIT:
I've modified the above model based on suggestions ,
If the admin.py
is like so , I don't get any error , and the model appears on the admin.
class AbstractAdminModel( admin.ModelAdmin ):
pass#fields = ['author' , 'editor' , 'created_at' , 'edited_at']
class Admin_Topic( AbstractAdminModel ):
pass
admin.site.register( Topic , Admin_Topic )
But If i modify it like so
class AbstractAdminModel( admin.ModelAdmin ):
fields = ['author' , 'editor' , 'created_at' , 'edited_at']
class Admin_Topic( AbstractAdminModel ):
pass
admin.site.register( Topic , Admin_Topic )
I get the following error :
Here is a stack trace Link
Problem : The model does not even appear on the Admin Page
Extra Info:
using django 1.2.5 with pinax 0.7.2 , Ubuntu 11.04 , python 2.7.1+
回答1:
Maybe it is bit to late for you for the answer, but I think others can have similar problem - as I did.
Here is my solution - I am not sure if it is proper, but it works for me and non other from above can do the same (assuming that you want a multitable inheritance (non abstract model), as I do)
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:
Yes it's possible. I think the error you done is to put:
class Meta:
abstract = True
in your Abstract_Admin_Model
class. Try without the Meta
class.
回答3:
The problem is here:
class Admin_Topic( admin.ModelAdmin ):
This line controls the inheritance, so it should be:
class Admin_Topic( Abstract_Admin_Model ):
Also worth noting: you may wish to use TopicAdmin
rather than Admin_Topic
to better match the Django convention.
回答4:
Try changing:
class Meta:
abstract = True
to
class Meta:
model = Topic
abstract = True
回答5:
The inheritance in your modified admin.py works. The problem is that you are adding the field 'created_at' to the admin (Admin_RSSFeed), but it does not exist on the model (probably named RSSFeed?). (At least that is what the error screenshot tries to tell you.)
回答6:
To use the parent's class attributes, such as list_display
or search_fields
you can do the following:
@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')
Similarly you can do that for other attributes like actions
, readonly_fields
, etc.
来源:https://stackoverflow.com/questions/7376102/django-admin-model-inheritance-is-it-possible