2013-06-30 15 views
20

Ho un filtro (una delle impostazioni predefinite e non personalizzate)Come modificare il titolo di Django filtro amministratore

E 'possibile solo per cambiare il titolo del filtro, senza scrivere un nuovo filtro personalizzato completo?

Perché l'unica personalizzazione richiesta dal filtro è il titolo. Dovrebbe essere un modo per farlo senza riscrivere l'intero filtro e le ricerche.

+1

Nessun modo ovvio, scrivere un filtro personalizzato è il modo più semplice. Altrimenti è necessario sovrascrivere 'ChangeList.get_filters' o modificare il titolo on-fly tramite Javascript. – okm

+2

La modifica del JS sarebbe molto non pythonic. Impossibilità di traceback e cattiva durante la fase di manutenzione. – iankit

risposta

25

È sarà necessità di avere una classe filtro personalizzato, ma in realtà si può implementare una fabbrica di classe filtro personalizzato che è possibile utilizzare ovunque è sufficiente un filtro con un titolo personalizzato:

from django.contrib import admin 

def custom_titled_filter(title): 
    class Wrapper(admin.FieldListFilter): 
     def __new__(cls, *args, **kwargs): 
      instance = admin.FieldListFilter.create(*args, **kwargs) 
      instance.title = title 
      return instance 
    return Wrapper 

Dopo di che nella ModelAdmin classe:

list_filter = (
    ('fieldname', custom_titled_filter('My Custom Title')), 
    'plain_field', 
    ... 
) 

(si noti come il filtro personalizzato non è solo un nome di campo, ma una tupla di (field_name, CustomFilterClass), sei solo ottenere il vostro CustomFilterClass fr om your custom_titled_filter() factory)

+1

Nota che è necessario ereditare da 'admin.RelatedFieldListFilter' se si desidera filtrare su un valore di chiave esterna. – simpleigh

+1

@lanzz: Closing ')' manca: '('fieldname', custom_titled_filter ('My Custom Title')),' – allcaps

+0

Vorrei raccomandare custom_title_filter (title, Klass) –

25

se si definisce etichette sui vostri campi nel modello, si dovrebbe vedere il cambiamento sulle opzioni di filtro: Come,

is_staff = models.BooleanField(verbose_name="My Best Staff's", default=False) 

Qui "il mio migliore personale" è il filtro etichetta.