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).