2011-08-25 4 views
1

J'ai besoin de filtrer une liste d'admin basée sur un TextField. Je veux pouvoir filtrer le jeu de requête pour tous les objets dont la valeur TextField est Null.Django Admin Liste de filtrage par TextField

J'ai essayé les éléments suivants:

def filter_for_field(self, request, queryset): 

    queryset=queryset.exclude(field__isnull=True) 
    return queryset 

J'ai ajouté que comme une méthode pour mon AdminModel puis ajouté la propriété « actions = [ « filter_for_field »]

J'ai aussi essayé de le faire sans. une déclaration de retour, pas de dés. l'action montre dans l'administration, mais il ne supprime pas les objets avec une valeur nulle pour le TextField.

Qu'est-ce que je fais mal?

Y a-t-il une meilleure façon de faire cela?

Répondre

1

Vous pouvez utiliser la fonctionnalité custom FilterSpec pour créer un filtre d'administration personnalisé. Il est disponible dans la version SVN de Django dès maintenant et prévu pour Django 1.4.

from django.contrib.admin import SimpleListFilter 

class IsNullFilter(SimpleListFilter): 
    # Human-readable title which will be displayed in the 
    # right admin sidebar just above the filter options. 
    title = _('Custom filter') 

    # Parameter for the filter that will be used in the URL query. 
    parameter_name = 'custom_filter' 

    def lookups(self, request, model_admin): 
     """ 
     Returns a list of tuples. The first element in each 
     tuple is the coded value for the option that will 
     appear in the URL query. The second element is the 
     human-readable name for the option that will appear 
     in the right sidebar. 
     """ 
     return (
      ('True', _('is Null')), 
      ('False', _('is not Null')), 
     ) 

    def queryset(self, request, queryset): 
     """ 
     Returns the filtered queryset based on the value 
     provided in the query string and retrievable via 
     `self.value()`. 
     """ 

     if self.value() == 'True': 
      return queryset.filter(costomfield__isnull=True) 
     if self.value() == 'True': 
      return queryset.filter(costomfield__isnull=False) 

Ensuite, vous devez passer en ModelAdmin.list_filter:

class CustomModelAdmin(admin.ModelAdmin): 
    list_filter = (IsNullFilter,) 
Questions connexes