Eu tenho um Person
modelo que possui uma relação de chave estrangeira Book
, que possui vários campos, mas estou mais preocupado com author
(um CharField padrão).
Com isso dito, no meu PersonAdmin
modelo, eu gostaria de exibir book.author
usando list_display
:
class PersonAdmin(admin.ModelAdmin):
list_display = ['book.author',]
Eu tentei todos os métodos óbvios para fazer isso, mas nada parece funcionar.
Alguma sugestão?
get_author
, já que é isso que a string que você está retornando (e a breve descrição) realmente faz referência? Ou altere o argumento de formato de string paraobj.book.reviews
?author = ForeignKey(Author)
no modelo de livro e depoislist_display = ('author')
?select_related
é para isso que serve. oget_queryset()
daUserAdmin
vontade terá que ser substituído.Apesar de todas as ótimas respostas acima e por eu ser novo no Django, eu ainda estava preso. Aqui está a minha explicação de uma perspectiva muito nova.
models.py
admin.py (Maneira incorreta) - você acha que funcionaria usando 'model__field' para fazer referência, mas não
admin.py (Maneira Correta) - é assim que você faz referência a um nome de chave estrangeira à maneira do Django
Para referência adicional, veja o link do modelo do Django aqui
fonte
obj
éBookAdmin
?Como o resto, eu também usei callables. Mas eles têm uma desvantagem: por padrão, você não pode pedir neles. Felizmente, existe uma solução para isso:
Django> = 1.8
Django <1.8
fonte
def author(self, obj):
Observe que a adição da
get_author
função atrasaria o list_display no administrador, pois mostrar cada pessoa faria uma consulta SQL.Para evitar isso, você precisa modificar o
get_queryset
método no PersonAdmin, por exemplo:fonte
__str__
rota, adicione a chave estrangeira alist_display
elist_select_related
De acordo com a documentação, você só pode exibir a
__unicode__
representação de uma chave estrangeira:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#list-display
Parece estranho que ele não suporta o
'book__author'
formato de estilo usado em qualquer outro lugar na API do banco de dados.Acontece que há um ticket para esse recurso , marcado como Não será corrigido.
fonte
Acabei de publicar um fragmento que faz com que admin.ModelAdmin suporte a sintaxe '__':
http://djangosnippets.org/snippets/2887/
Então você pode fazer:
Isso basicamente faz o mesmo descrito nas outras respostas, mas cuida automaticamente de (1) configurar admin_order_field (2) configurar short_description e (3) modificar o conjunto de consultas para evitar um acerto no banco de dados para cada linha.
fonte
AttributeError: type object 'BaseModel' has no attribute '__metaclass__'
Você pode mostrar o que quiser na exibição da lista usando uma chamada. Seria assim:
fonte
Este já foi aceito, mas se houver outros manequins por aí (como eu) que não obtiveram imediatamente a resposta atualmente aceita , aqui está um pouco mais detalhadamente.
A classe de modelo referenciada pelas
ForeignKey
necessidades de ter um__unicode__
método dentro dela, como aqui:Isso fez a diferença para mim e deve se aplicar ao cenário acima. Isso funciona no Django 1.0.2.
fonte
def __str__(self):
.Se você tem muitos campos de atributos de relação para usar
list_display
e não deseja criar uma função (e seus atributos) para cada um, uma solução simples, porém simples, substituirá o métodoModelAdmin
instace__getattr__
, criando as chamadas imediatamente:Como essência aqui
Atributos especiais solicitáveis, como
boolean
eshort_description
devem ser definidos comoModelAdmin
atributos, por exemplo,book__author_verbose_name = 'Author name'
ecategory__is_new_boolean = True
.O
admin_order_field
atributo de chamada é definido automaticamente.Não se esqueça de usar o atributo list_select_related no seu
ModelAdmin
para fazer o Django evitar consultas adicionais.fonte
Existe um pacote muito fácil de usar disponível no PyPI que lida exatamente com isso: django-related-admin . Você também pode ver o código no GitHub .
Usando isso, o que você deseja alcançar é tão simples quanto:
Ambos os links contêm detalhes completos de instalação e uso, portanto, não os colarei aqui caso eles mudem.
Assim como uma nota lateral, se você já estiver usando algo diferente
model.Admin
(por exemplo, eu estava usandoSimpleHistoryAdmin
em seu lugar), você pode fazer isso:class MyAdmin(SimpleHistoryAdmin, RelatedFieldAdmin)
.fonte
se você tentar em linha, você não terá êxito, a menos que:
no seu inline:
no seu modelo (MyModel):
fonte
A resposta de AlexRobbins funcionou para mim, exceto que as duas primeiras linhas precisam estar no modelo (talvez isso tenha sido assumido?) E deve fazer referência a si mesmo:
Em seguida, a parte administrativa funciona bem.
fonte
Eu prefiro isso:
fonte