2011-06-13 7 views
6

que tienen estos modelos:¿Cómo puedo personalizar la visualización de un modelo usando tipos de contenido en el administrador?

class App(models.Model): 
    name = models.CharField(max_length=100) 

class ProjectA(models.Model): 
    name = models.CharField(max_length=100) 
    app = models.ForeignKey(App) 

class ProjectB(ProjectA): 
    pass 

class Attachment(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id  = models.PositiveIntegerField() 
    project   = generic.GenericForeignKey("content_type","object_id") 
    file   = models.FileField(upload_to=".") 

estoy registrando todos los modelos para el administrador, y estoy anular el registro de grupo, usuario y el sitio. La cosa es que, al acceder el archivo adjunto en el administrador, veo que vuelve de esta manera:

admin for attachment

En el tipo de contenido de selección, veo esta lista:

select

la El motivo por el que Attachment tiene un GenericForeignKey se debe a que tanto ProjectA como ProjectB necesitan acceder a él. Sé que ProjectA y ProjectB son idénticos, pero es un requisito que estén almacenados en 2 tablas separadas. ¿Cómo podría hacer que la clase de archivo adjunto sea utilizable por el administrador? Sé cómo usar los tipos de contenido desde vistas normales, pero desde el administrador no.

En la clase de archivo adjunto solo me gustaría seleccionar un Proyecto A o Proyecto B, y luego una lista de todos los Proyectos A o todos los Proyectos B, seguidos del archivo que deseo adjuntar.

tal cosa sea posible de la administración? ¿Tendré que mostrarle al usuario la columna Object Id?

Respuesta

8

si no estoy equivocado , Tu quieres esto. http://code.google.com/p/django-genericadmin/

mi consejo funcionará de forma diferente. agregará un poco más de forma en ProjectA, ProjectB como en línea. en su admin.py

from django.contrib import admin 
from django.contrib.contenttypes import generic 

from myproject.myapp.models import Attachment, ProjectA, ProjectB 

class Attachmentline(generic.GenericTabularInline): #or generic.GenericStackedInline, this has different visual layout. 
    model = Attachment 

class ProjectAdmin(admin.ModelAdmin): 
    inlines = [ 
     Attachmentline, 
    ] 

admin.site.register(ProjectA, ProjectAdmin) 
admin.site.register(ProjectB, ProjectAdmin) 

vaya a su administrador ProjectA o ProjectB y vea el nuevo administrador.

esto no es lo que quiere, pero puede ayudar. de lo contrario, debe verificar el primer enlace.

+0

Hermosa alternativa. ¡Gracias! – Geo

+0

No sabía que había un 'generic.GenericTabularInline' – Ajoy

1

Usted debe notar que

"saben que ProjectA y ProjectB son idéntica, pero es un requisito que que se almacenan en 2 mesas separadas"

no es realmente correcto. Todos los datos se almacenan en su tabla app_projecta, y (solo) algunos punteros se mantienen en la tabla app_projectb. Si ya va en esta ruta, sugeriría a partir de este lugar:

class App(models.Model): 
    name = models.CharField(max_length=100) 

class Project(models.Model): 
    name = models.CharField(max_length=100) 
    app = models.ForeignKey(App) 

class ProjectA(Project): 
    pass 

class ProjectB(Project): 
    pass 

class Attachment(models.Model): 
    project = models.ForeignKey(Project) 
    file   = models.FileField(upload_to=".") 

Esto ya que se hace un poco más cerca de donde usted desea conseguir ...

+0

Gracias. ¿Qué pasa con el campo de opciones para GenericForeignKey? ¿Conoces una solución para eso? – Geo

+0

El método presentado por Udi no requiere el uso de claves externas genéricas. Solo hace referencia al modelo de proyecto utilizando claves extranjeras antiguas simples. Sin embargo, un inconveniente es que un proyecto puede ser tanto un ProjectA como un ProjectB, o ninguno. Deberá verificar la consistencia de la base de datos de vez en cuando, si ofrece la posibilidad de convertir un ProjectA en un ProjectB. – sleblanc

Cuestiones relacionadas