BOMBOLOM.COM

(django) list_display com ManyToManyField

Este é um post de José Lopes.

No painel de administração do Django a opção list_display não aceita campos ManyToManyField, estando devidamente mencionado na sua documentação. A razão deve-se ao facto de tais campos forçarem uma declaração SQL para cada linha da tabela.

Nesta mesma documentação sugere-se, no caso de queremos um campo deste tipo, criar um método e incluí-lo no list_display. Infelizmente não mostra um exemplo prático, ou pelo menos eu não o encontrei, pelo que este post visa mostrar um exemplo de tal funcionalidade.

Vamos imaginar que no seu models.py tem algo do tipo:

class Reference(models.Model):
    something = models.CharField(max_length=100)

    def __str__(self):
        return self.something

class MyModel(models.Model):
    other_thing = models.CharField(max_length=100)
    references = models.ManyToManyField(Reference)

Como pode verificar, a primeira classe representa um modelo com um campo de caracteres enquanto a segunda classe é o nosso modelo que tem um campo com relação ManyToMany.

De assinalar a função criada na primeira classe para passar os valores de something como string. Sem esta função os valores não serão visíveis no painel de administração ou em views que sejam criadas.

Se quisermos personalizar o painel de administração fazemos normalmente:

class MyModel(models.Model):
    other_thing = models.CharField(max_length=100)
    references = models.ManyToManyField(Reference)

    class Admin:
        list_display = ('other_thing', 'references')

Tendo um campo ManyToMany no list_display vamos obter um erro e nossa lista não será visualizável. A solução passa então por criar um método e incluí-lo no list_display:

class MyModel(models.Model):
    other_thing = models.CharField(max_length=100)
    references = models.ManyToManyField(Reference)

    def show_references(self):
        references = ", ".join([k.__str__() for k in self.references.all()])
        return references

    class Admin:
        list_display = ('other_thing', 'show_references')

O método não é mais do que uma função em que podemos agrupar a informação do campo ManyToMany segundo a forma que entendermos melhor. Neste exemplo juntamos, separadas por vírgulas, todas as ocorrências de um campo.

De notar que esta função é chamada dentro do list_display em vez do campo ManyToMany.

Deste modo já pode visualizar no painel de administração os dados de um campo ManyToMany, o que frequentemente é útil se utilizar esta poderosa ferramenta de administração nos seus projectos.

26.02.2008 | Ler mais | Comentários | Tags

Voltar à Página principal | Made with PyBlosxom