Mam Person
model, który ma powiązanie z kluczem obcym Book
, który ma wiele pól, ale najbardziej mnie to martwi author
(standardowy CharField).
Biorąc to pod uwagę, w moim PersonAdmin
modelu chciałbym wyświetlić book.author
za pomocą list_display
:
class PersonAdmin(admin.ModelAdmin):
list_display = ['book.author',]
Wypróbowałem wszystkie oczywiste metody, ale wydaje się, że nic nie działa.
Jakieś sugestie?
get_author
, ponieważ to właśnie do tego zwracany jest ciąg znaków (i krótki opis)? Lub zmień argument formatu ciągu naobj.book.reviews
?author = ForeignKey(Author)
modelu książkilist_display = ('author')
?select_related
jest.get_queryset()
zUserAdmin
będą musiały być zastąpione.Pomimo wszystkich świetnych odpowiedzi powyżej i ponieważ byłem nowy w Django, nadal utknąłem. Oto moje wyjaśnienie z bardzo początkującej perspektywy.
models.py
admin.py (Niepoprawny sposób) - myślisz, że to zadziałałoby, używając odniesienia do „model__field”, ale nie działa
admin.py (poprawny sposób) - w ten sposób odwołujesz się do nazwy klucza obcego w sposób Django
Aby uzyskać dodatkowe informacje, zobacz link do modelu Django tutaj
źródło
obj
jestBookAdmin
?Podobnie jak reszta, ja też poszedłem z kalabrami. Ale mają jedną wadę: domyślnie nie można na nich zamówić. Na szczęście istnieje na to rozwiązanie:
Django> = 1,8
Django <1.8
źródło
def author(self, obj):
Pamiętaj, że dodanie
get_author
funkcji spowolniłoby wyświetlanie listy w adminie, ponieważ pokazanie każdej osobie spowodowałoby zapytanie SQL.Aby tego uniknąć, musisz zmodyfikować
get_queryset
metodę w PersonAdmin, na przykład:źródło
__str__
trasą, po prostu dodaj klucz obcy dolist_display
ilist_select_related
Zgodnie z dokumentacją można wyświetlić tylko
__unicode__
reprezentację klucza obcego:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#list-display
Wydaje się dziwne, że nie obsługuje
'book__author'
formatu stylu, który jest używany wszędzie indziej w DB API.Okazuje się, że jest bilet na tę funkcję , która jest oznaczona jako Nie naprawi.
źródło
Właśnie opublikowałem fragment kodu, który sprawia, że admin.ModelAdmin obsługuje składnię „__”:
http://djangosnippets.org/snippets/2887/
Możesz więc zrobić:
Zasadniczo polega to na wykonaniu tej samej czynności opisanej w innych odpowiedziach, ale automatycznie zajmuje się (1) ustawieniem pola admin_order_field (2) ustawieniem short_description i (3) modyfikacją zestawu zapytań, aby uniknąć trafienia do bazy danych dla każdego wiersza.
źródło
AttributeError: type object 'BaseModel' has no attribute '__metaclass__'
Możesz pokazać, co chcesz na ekranie listy, używając kalendarza. Wyglądałoby to tak:
źródło
Ten jest już zaakceptowany, ale jeśli istnieją inne manekiny (takie jak ja), które nie otrzymały go natychmiast z obecnie przyjętej odpowiedzi , oto nieco więcej szczegółów.
Klasa modelu, do której odwołuje się
ForeignKey
potrzeba, musi zawierać w sobie__unicode__
metodę, jak tutaj:To dla mnie stanowiło różnicę i powinno mieć zastosowanie do powyższego scenariusza. Działa to w Django 1.0.2.
źródło
def __str__(self):
.Jeśli masz wiele pól atrybutów relacji do użycia
list_display
i nie chcesz tworzyć funkcji (i jej atrybutów) dla każdego z nich, brudne, ale proste rozwiązanie zastąpiłoby metodęModelAdmin
instace__getattr__
, tworząc na żądanie kallaby:Jak istota tutaj
Wywoływalne especial cechy jak
boolean
ishort_description
musi być określone jakoModelAdmin
cechy, npbook__author_verbose_name = 'Author name'
icategory__is_new_boolean = True
.admin_order_field
Atrybut wywoływalny jest definiowany automatycznie.Nie zapomnij użyć atrybutu list_select_related,
ModelAdmin
aby Django unikał dodatkowych zapytań.źródło
W PyPI dostępny jest bardzo łatwy w użyciu pakiet, który obsługuje dokładnie to: django-related-admin . Możesz także zobaczyć kod w GitHub .
Korzystanie z tego, co chcesz osiągnąć, jest tak proste, jak:
Oba linki zawierają pełne dane dotyczące instalacji i użytkowania, więc nie wkleję ich tutaj na wypadek, gdyby się zmieniły.
Podobnie jak marginesie, jeśli używasz już coś innego niż
model.Admin
(np używałemSimpleHistoryAdmin
zamiast), można to zrobić:class MyAdmin(SimpleHistoryAdmin, RelatedFieldAdmin)
.źródło
jeśli spróbujesz w Inline, nie odniesiesz sukcesu, chyba że:
w twoim inline:
w twoim modelu (MyModel):
źródło
Odpowiedź AlexRobbinsa działała dla mnie, z tym wyjątkiem, że pierwsze dwie linie muszą znajdować się w modelu (być może to założono?) I powinny odnosić się do siebie:
Następnie część administracyjna działa dobrze.
źródło
Wolę to:
źródło