2010-09-07 4 views
2

Je pense que cela est plus facile à comprendre comme un exemple:Dans l'admin Django est-il possible de séparer les modèles en sous-modèles basés sur des groupes?

J'ai modèles Image et ImageType, où l'image et a exactement un type. Les paramètres de ImageType régiraient la taille de l'image, la taille des vignettes, etc., car les images des galeries photo pourraient différer des images de profil, par exemple.

Je souhaite que les images de profil et les images de galerie apparaissent séparément dans le site d'administration Django. Une option est de faire quelque chose comme ceci:

class ProfileImage (Image): 
    pass 

class GalleryImage (Image): 
    pass 

class ProfileImageAdmin (ImageAdmin): 
    def queryset(self, request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return qs.filter(type='profile') 

class GalleryImageAdmin (ImageAdmin): 
    def queryset(self, request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return qs.filter(type='gallery') 

admin.site.register(ProfileImage, ProfileImageAdmin) 
admin.site.register(GalleryImage, GalleryImageAdmin) 

Mais en plus d'avoir le code redondant, qui va à l'encontre complètement dans le but d'avoir une base de données pour organiser ces en premier lieu. Une autre option est de perdre mes modèles Image et ImageType et de créer des tables séparées presque identiques pour chaque type (par exemple ProfileImage et GalleryImage), mais c'est encore pire, car cela obligerait les utilisateurs à avoir accès aux fichiers de configuration, ce qui selon moi presque défait le but d'un CMS.

Y at-il un moyen de faire quelque chose comme ça?

admin.site.register(Image, ImageAdmin, group_by='type') 

Sinon, si cela est impossible, quelqu'un a-t-il des suggestions pour d'autres façons d'y remédier? (Par exemple, existe-t-il un moyen en python de créer dynamiquement des classes basées sur la base de données?)

Cheers! Matt

+0

Non il n'y a pas, mais ce que vous pouvez faire est d'ajouter une nouvelle URL avec '' méthode get_urls' sur ModelAdmin' qui indiquerait votre point de vue changelist personnalisé sur la même classe 'ModelAdmin' qui fixerait la queryset à utiliser, et remplacer les administrateurs 'index.html' afin de changer l'apparence de la page de liste des applications d'administration par défaut. –

+0

Je ne sais pas si cela résout votre problème, ou ce que vous devez accomplir avec votre classe 'ImageType', mais si vous ne le savez pas, jetez un oeil à la merveilleuse application photologue (https://code.google .com/p/django-photologue /), qui permet de contrôler les tailles etc confortablement à partir du template alors que l'utilisateur final peut encore spécifier les tailles et beaucoup plus de choses dans l'admin! –

Répondre

4

Il existe un moyen. Cela implique l'utilisation d'un modèle proxy pour un type d'image (ou les deux). Vous pouvez ensuite ajouter des administrateurs distincts pour les deux. Par exemple

# models.py 
class ProfileImage (Image): 
    class Meta: 
     proxy = True 

class GalleryImage (Image): 
    class Meta: 
     proxy = True 

Cela évitera de créer de nouvelles tables. Vous stockez toujours toutes les données dans la table correspondant au modèle Image. Vous pouvez ensuite enregistrer deux administrateurs différents pour ces procurations.

# admin.py 
class ProfileImageAdmin (ImageAdmin): 
    def queryset(self, request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return qs.filter(type='profile') 

class GalleryImageAdmin (ImageAdmin): 
    def queryset(self, request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return qs.filter(type='gallery') 

admin.site.register(ProfileImage, ProfileImageAdmin) 
admin.site.register(GalleryImage, GalleryImageAdmin) 
+1

Merci. Ce n'est pas tout à fait ce que j'espérais, mais c'est beaucoup mieux que ce que j'avais auparavant, et il semble que ce soit aussi bon que possible. Merci encore! – Maaatt

+0

Où est défini 'type'? – jul

Questions connexes