Django Admin – Filtro com ForeignKey


Opa!

Não sei se o título foi claro, mas vou explicar o “problema” que tive e colocar o link da solução que eu encontrei no fantástico DjangoSnippets ^^
2 models relacionados e eu precisava filtrar no admin por um campo do model “pai” que não seu id ou instância.
( Acho que é isto xD )
Vamos exemplificar com códigos para ficar mais explicado ^^.

Model A:


class modelA(models.Model):
    descricao = models.CharField(max_length = 30)
    versao_dados = models.IntegerField(unique = True)
    arquivo = models.FileField(upload_to='tempfolder')

class modelB(models.Model):
    papai = models.ForeignKey(modelA) #Papai! kkkkk
    codigo = models.IntegerField()
    descricao = models.CharField(max_length = 100)
    class Meta:
        unique_together = (('rol', 'codigo'),)

Como você pode ver, se eu tentar cadastrar um modelA com a mesma versão já existente, o Django não deixará porque ele é único 😉

Já no modelB é um pouco diferente. Estou utilizando o unique_together, onde ele verificará como um registro único a união de papai e código, ou seja, eu poderei ter vários códigos repetidos, desde que cada um pertença a um papai diferente! xD ( Eu me acho engraçado às vezes kkk )
Este é o comportamento que eu preciso na minha aplicação 😉

Já no admin, eu precisava de um list_filter para o modelB que pudesse me mostrar a lista de versões cadastradas no modelA, e filtrar os dados do modelB de acordo com o que eu selecionar.
Ah tá!! Mas o Django não faz isto 😦 –> (Damn it!)  Bom, pelo menos não achei nada parecido 🙂

Então achei um snippet que faz workar! ^^

Aqui está o link da criança!
http://djangosnippets.org/snippets/2194/

No meu caso, eu coloquei o código dentro de uma pasta chamada utils, onde eu coloco algumas coisas que são peculiares a cada app.

O modelA ficou do mesmo jeito, já o modelB ficou assim:


class modelB(models.Model):
    papai = models.ForeignKey(modelA) #Papai! kkkkk
    papai.fk_filterspec = {'fk_field': 'versao_dados', }
    codigo = models.IntegerField()
    descricao = models.CharField(max_length = 100)
    class Meta:
        unique_together = (('rol', 'codigo'),)

Lembrando que é necessário importar o primeiro trecho que no meu caso, eu coloquei dentro de um arquivo que chamei de filterSpects, dentro da pasta utils da minha app.
Então ficou assim:

 from app.utils.filterSpecs import FkFilterSpec
 FkFilterSpec.register_filterspec()

Já no admin, ficou assim:

 list_filter = ('papai__versao_dados',)

Enfim, ficou bão !  ^^

Espero que seja útil pra mais alguém!!!

Abraços.objects.all()

Anúncios

4 Respostas to “Django Admin – Filtro com ForeignKey”

  1. Fred,

    Realmente pelo título do post fica meio complicado de entender do que se trata, no entanto a explicação está bem clara.

    Parabéns garoto

  2. Olá estou precisando de um experiente desenvolvedor django para um freela urgente!. Você teria alguem para me indicar? Meu email é marcoscampelo [at] gmail.com . Obg.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: