variable tutorial template framework examples python django django-models django-admin pinax

python - template - django tutorial



Modelo de administración de Django ¿Es posible? (5)

¿Es posible la herencia en modelos de administrador?

Como por ejemplo, considere lo siguiente,

Archivo: 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()

Una herencia similar no parece producir el resultado correcto cuando se usa en ModelAdmin

Archivo: 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 )

EDITAR :

Modifiqué el modelo anterior en base a sugerencias,

Si admin.py es así, no obtengo ningún error y el modelo aparece en el administrador.

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

Pero si lo modifico como tal

class AbstractAdminModel( admin.ModelAdmin ): fields = [''author'' , ''editor'' , ''created_at'' , ''edited_at''] class Admin_Topic( AbstractAdminModel ): pass admin.site.register( Topic , Admin_Topic )

Obtuve el siguiente error :

Aquí hay un enlace de seguimiento de pila

Problema: el modelo ni siquiera aparece en la página de administración

Información extra:

usando django 1.2.5 con pinax 0.7.2, Ubuntu 11.04, python 2.7.1+


El problema está aquí:

class Admin_Topic( admin.ModelAdmin ):

Esta línea controla la herencia, por lo que debería ser:

class Admin_Topic( Abstract_Admin_Model ):

También vale la pena señalar: es posible que desee utilizar TopicAdmin lugar de Admin_Topic para que coincida mejor con la convención de Django.


Intenta cambiar:

class Meta: abstract = True

a

class Meta: model = Topic abstract = True


Si es posible. Creo que el error que has hecho es poner:

class Meta: abstract = True

en tu clase Abstract_Admin_Model . Pruebe sin la clase Meta .


Tal vez es un poco tarde para ti la respuesta, pero creo que otros pueden tener un problema similar, como yo.

Aquí está mi solución: no estoy seguro de si es correcto, pero a mí me funciona y otros que no sean de arriba pueden hacer lo mismo (suponiendo que quieras una herencia múltiple (modelo no abstracto), como yo)

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


La herencia en su admin.py modificado funciona. El problema es que está agregando el campo ''created_at'' al administrador (Admin_RSSFeed), pero no existe en el modelo (probablemente llamado RSSFeed?). (Al menos eso es lo que la captura de pantalla de error intenta decirle).