sexta-feira, 21 de junho de 2013

Exibir e ordenar por um campo FK de outra classe no change list

Comumente utilizamos classe com FKs e no change list do admin existe a possibilidade de fazer filtros por esses campos da seguinte forma:

list_filter = ['suafk__seuatributo']

Sabia que tem como fazer isso ser exibido também no list_display?

Se tentarmos utilizar da mesma forma surge o seguinte erro:

ImproperlyConfigured at /admin/seu-app/sua-classe/
Sua-ClasseAdmin.list_display[4], 'suafk__seuatributo' is not a callable or an attribute of 'Sua-ClasseAdmin' or found in the model 'Sua-Classe'.

O numero 4 indica a posição que colocou o atributo a ser exibido, e pode variar de acordo com a posição que colocar.

Mas então como fazer isso? Simples:

No seu models.py crie um método dentro da classe que tem a FK do atributo que deseja listar da seguinte forma:

def seu_metodo(self):
    return self.suafk.seuatributo
seu_metodo.admin_order_field = 'suafk__seuatributo'


Agora basta chamar o metodo recem criado no list_display:

list_display = ('seu_metodo')


hasta!