2013-05-22 3 views
2

Par souci de simplicité, nous allons dire que j'ai modèle produit et modèle Paramètres. Par défaut, dans le modèle produit Je veux que ces paramètres:Django admin: différentes (conditionnelles) paramètres de la liste si le popup (raw_id_fields, list_display, list_filter)

class ProductAdmin(ModelAdmin): 
    list_display = ('name', 'brand', 'sort', 'specific', 'link_to_frontend', 'category_names', 'ean', 'created', 'creator') 
    list_filter = ('category', 'creator') 
    search_fields = ('name', 'brand__name', 'sort', 'specific', 'category__name', 'ean') 

Dans Paramètres ajouter/modifier, j'ai ajouté comme raw_id_fields. Comme j'ai beaucoup de colonnes à l'intérieur de la liste des produits par défaut, je voudrais faire des paramètres différents si popup:

class ProductAdmin(ModelAdmin): 
    list_display = ('name', 'brand', 'sort', 'specific', 'category_names') 
    list_filter =() 
    search_fields = ('name', 'brand__name', 'sort', 'specific', 'category__name') 

Toute aide appréciée.

Répondre

3

Enfin, trouvé la solution. J'ai créé une propre classe ModelAdmin universelle, dans le fichier admin.py de l'application universelle:

from django.contrib import admin 
from django.contrib.admin.views.main import IS_POPUP_VAR 

class YourModelAdmin(admin.ModelAdmin): 
    popup_list_display =() 
    popup_list_filter =() 

    def get_list_display(self, request): 
     if IS_POPUP_VAR in request.GET and self.popup_list_display: # return list_display if not set 
      return self.popup_list_display 
     else: 
      return self.list_display 

    def get_list_filter(self, request): 
     if IS_POPUP_VAR in request.GET: # return empty tuple if not set 
      return self.popup_list_filter 
     else: 
      return self.list_filter 

et de l'administration de l'application, je vous appelle:

from django.contrib import admin 
from [your-uni-app].admin import YourModelAdmin # not necessary if in same file 

class ProductAdmin(YourModelAdmin): # e.g. 
    list_display = ('name', 'category', 'properties',) 
    popup_list_display = ('name', 'category',) 
    # same settings for list_filter and popup_list_filter 

admin.register(Product, ProductAdmin) 

Cette solution est également ouverte à list_display conditionnelle basée sur certains user-role (eg) ou manipulation avec list_display avant de retourner (ajouter une colonne automatiquement à toutes les listes). Idem pour list_filter et toute fonction de django.contrib.admin.ModelAdmin (ou BaseModelAdmin) si remplacée.

Remplacer search_fields signifie créer un remplacement de la fonction django.contrib.admin.ModelAdmin.chagnelist_view. Pour moi, c'est devenu inutile car j'ai besoin de la même recherche dans les deux modes, normal et popup. Cependant, seul le négatif d'aucune capacité d'écraser est que vous pouvez rechercher par domaine qui n'est pas visible, ce qui semble être pas si gros problème ...

Espérons que cela aidera à tout le monde.

Questions connexes