Модель администратора Django Наследование возможно? - PullRequest
5 голосов
/ 11 сентября 2011

Возможно ли наследование в моделях администратора?

Как например, рассмотрим следующее,

Файл: 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Подобное наследование не дает правильного результата при использовании в 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 )

Я получу следующую ошибку:

the Error

Вот трассировка стека Ссылка

Проблема: Модель даже не отображается на странице администратора

Дополнительная информация:

используя django 1.2.5 с pinax 0.7.2, Ubuntu 11.04, python 2.7.1 +

Ответы [ 5 ]

4 голосов
/ 20 ноября 2011

Может быть, вам уже поздно получать ответ, но я думаю, что у других может быть похожая проблема - как и у меня.

Вот мое решение - я не уверен, что оно правильное, но оно работает для меня, и другие не могут сделать то же самое (если предположить, что вы хотите множественное наследование (не абстрактная модель), как у меня)

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


class PhotoAdmin(SiteEntityAdmin):
    fieldsets = [
             ('Photo details', {'fields': ['photo_url', 'description']}),
    ]
    fieldsets.insert(0, SiteEntityAdmin.fieldsets[0])
3 голосов
/ 11 сентября 2011

Да, это возможно.Я думаю, что ошибка, которую вы сделали, это поместить:

class Meta:
    abstract = True

в ваш Abstract_Admin_Model класс.Попробуйте без Meta класса.

1 голос
/ 11 сентября 2011

Проблема здесь:

class Admin_Topic( admin.ModelAdmin ):

Эта строка управляет наследованием, поэтому она должна быть:

class Admin_Topic( Abstract_Admin_Model ):

Также стоит отметить: вы можете использовать TopicAdmin вместо Admin_Topic, чтобы лучше соответствовать соглашению Django.

0 голосов
/ 07 апреля 2014

Наследование в вашем измененном admin.py работает. Проблема заключается в том, что вы добавляете поле «create_at» к администратору (Admin_RSSFeed), но он не существует в модели (вероятно, называется RSSFeed?). (По крайней мере, это то, что пытается вам сказать скриншот с ошибкой.)

0 голосов
/ 11 сентября 2011

Попробуйте изменить:

    class Meta:
        abstract = True

до

    class Meta:
        model = Topic
        abstract = True
...