2012-02-25 9 views
23

Mam aplikację o nazwie doors, a moja models.py dla aplikacji ma 10 tabel/zajęć. Pod moim numerem admin.py, w jaki sposób mogę zarejestrować każdy model w pliku models.py?Zarejestruj każdy stół/klasę z aplikacji na stronie administratora Django.

Na przykład, obecnie muszę go zakodować:

from django.contrib import admin 
from doors.models import * 

admin.site.register(Group) 
admin.site.register(Item) 
admin.site.register(ItemType) 
admin.site.register(Location) 
admin.site.register(Log) 
admin.site.register(Order) 
admin.site.register(Property) 
admin.site.register(User) 
admin.site.register(Vendor) 

Czy istnieje sposób, że może znaleźć każda klasa w models.py i Loop Through i zarejestrować każdą klasę? Czy jest jakiś symbol wieloznaczny, którego mogę użyć z Django?

+2

Czy ten fragment robi to, co chcesz: http://djangosnippets.org/snippets/2066/? – arie

+0

Dzięki. Przeglądanie kodu bardzo pomogło. – hobbes3

Odpowiedz

16

wyobraziłem go z Link @ Arie (na Django < 1.8):

from django.contrib import admin 
from django.db.models import get_models, get_app 

for model in get_models(get_app('doors')): 
    admin.site.register(model) 

Ale zastanawiam się, czy mogę to zrobić bez get_app ... Nie można kod być wystarczająco inteligentny, aby wiedzieć, nazwa własnej aplikacji?

+0

Po chwili pomyślałem, że to może być zły pomysł, ponieważ nie możesz zarejestrować modelu dwa razy. Dlatego używaj tego kodu tylko wtedy, gdy nie potrzebujesz dostosowania do modeli na stronie administratora (np. Widoków listy, filtrów itp.). – hobbes3

+0

Aby dodać do tego, możesz użyć tego kodu i wykluczyć określone modele według nazwy (tj. Modele z dostosowaniami): dla modelu w get_models (get_app ('base')): jeśli model .__ nazwa__! = 'Subskrybent': admin .site.register (model) – Erve1879

+0

@ hobbes3 nie możesz się wyrejestrować i zarejestrować? Przynajmniej w Django 1.7, nie wiem o '12 :) – EralpB

24

Wydaje się, że get_models i get_app nie są już dostępne w django 1.8.

Poniższa można stosować:

from django.contrib import admin 
from django.apps import apps 

app = apps.get_app_config('dashboard') 

for model_name, model in app.models.items(): 
    admin.site.register(model) 

ROZSZERZENIE: Jeśli chcesz, aby pokazać wszystkie lub zaznacz pola modelu w postaci siatki zamiast pojedynczej reprezentacji kolumna unicode modelowych obiektów można użyć tego:

app = apps.get_app_config('your_app_name') 
for model_name, model in app.models.items(): 
    model_admin = type(model_name + "Admin", (admin.ModelAdmin,), {}) 

    model_admin.list_display = model.admin_list_display if hasattr(model, 'admin_list_display') else tuple([field.name for field in model._meta.fields]) 
    model_admin.list_filter = model.admin_list_filter if hasattr(model, 'admin_list_filter') else model_admin.list_display 
    model_admin.list_display_links = model.admin_list_display_links if hasattr(model, 'admin_list_display_links') else() 
    model_admin.list_editable = model.admin_list_editable if hasattr(model, 'admin_list_editable') else() 
    model_admin.search_fields = model.admin_search_fields if hasattr(model, 'admin_search_fields') else() 

    admin.site.register(model, model_admin) 

Co to robi to, że rozszerza klasę ModelAdmin w locie i ustawia pole list_display który jest wymagany do wyświetlania dane modelu w reprezentacji siatki w administratorze. Jeśli podasz listę żądanych pól w swoim modelu jako admin_list_display, to zajmie to, lub wygeneruje krotkę wszystkich pól dostępnych w modelu, w przeciwnym razie.

Inne opcjonalne pola mogą być podobnie ustawione, na przykład list_filter.

Aby uzyskać więcej informacji na temat wyświetlania listy, zobacz stronę django documentation.

11

Od Django 1.7, możesz użyć tego kodu w swojej admin.py:

from django.apps import apps 
from django.contrib import admin 
from django.contrib.admin.sites import AlreadyRegistered 

app_models = apps.get_app_config('my_app').get_models() 
for model in app_models: 
    try: 
     admin.site.register(model) 
    except AlreadyRegistered: 
     pass 
4

Od Django 1.8, aby rozwiązać komunikat o błędzie

RemovedInDjango19Warning: django.db.models.get_app is deprecated. 

możemy użyć tej metody w 2 linie

from django.contrib import admin 
from my_app.models import * 
from django.apps import apps 

for model in apps.get_app_config('my_app').models.values(): 
    admin.site.register(model) 
Powiązane problemy