Czy możesz nadać aplikacji Django pełną nazwę do użytku przez administratora?
140
W ten sam sposób, w jaki możesz nadać polom i modelom pełne nazwy, które pojawiają się w panelu administracyjnym Django, czy możesz nadać aplikacji niestandardową nazwę?
Nowe aplikacje powinny unikać default_app_config. Zamiast tego powinny wymagać AppConfigjawnego skonfigurowania kropkowanej ścieżki do odpowiedniej podklasy INSTALLED_APPS.
# in yourapp/apps.pyfrom django.apps importAppConfigclassYourAppConfig(AppConfig):
name ='yourapp'
verbose_name ='Fancy Title'
następnie ustaw default_app_configzmienną naYourAppConfig
# in yourapp/__init__.py
default_app_config ='yourapp.apps.YourAppConfig'
Przed Django 1.7
Możesz nadać aplikacji niestandardową nazwę, definiując app_label w definicji modelu. Ale gdy django buduje stronę administratora, będzie haszowało modele według ich etykiety_aplikacji, więc jeśli chcesz, aby pojawiały się w jednej aplikacji, musisz zdefiniować tę nazwę we wszystkich modelach aplikacji.
Miałem z tym problem w panelu administracyjnym. Tak wiele zależy od etykiety app_label, że kiedy zacząłem zmieniać nazwę, zepsuło to wszystko.
Joe J
Wiem, skończyło się na napisaniu szablonu, który miał dykt z wiązaniem app_url: app_name.
Frost.baka
58
Zwróć uwagę, że NIE jest to to samo, co pełna nazwa, w tym sensie, że wpływa tylko na to, co jest pokazywane użytkownikowi. Jest to ciąg literału używany do nazwania tabeli w bazie danych, co wymaga migracji schematu, jeśli zmieniasz istniejący model.
Cerin
6
Nie sądzę, żeby to było dobre rozwiązanie. Ma zbyt wiele innych skutków ubocznych, które nie są estetyczne.
David Sanders,
Ta popularna odpowiedź zaleca użycie hackowania / obejścia, które było potrzebne przed Django 1.7. Jeśli używasz wersji 1.7 lub nowszej, użyj pliku apps.py zgodnie z poniższymi zaleceniami iMaGiNiX.
shacker
38
Jak stwierdzono w komentarzu rhunwicks do OP, jest to teraz możliwe po wyjęciu z pudełka od wersji Django 1.7
Działa dobrze, ale kod w pliku init .py nie jest wymagany, jeśli zainstalujesz aplikację jako przykład rekomendacji Django w INTALLED_APPS: „Nazwa_aplikacji.apps.AppnameConfig”
Roberth Solís
31
Jeśli masz więcej niż jeden model w aplikacji, po prostu utwórz model z informacjami Meta i utwórz podklasy tej klasy dla wszystkich swoich modeli.
classMyAppModel(models.Model):classMeta:
app_label ='My App Label'
abstract =TrueclassCategory(MyAppModel):
name = models.CharField(max_length=50)
Nie rób sobie nadziei. Będziesz także musiał skopiować widok indeksu z django.contrib.admin.sites do własnego widoku ProjectAdminSite i dołączyć go do własnej niestandardowej instancji administratora:
Cóż, uruchomiłem aplikację o nazwie todo i zdecydowałem, że chcę, aby nazywała się Zadania . Problem polega na tym, że mam już dane w mojej tabeli, więc moja praca była następująca. Umieszczone w models.py:
W przypadku Django 1.4 (jeszcze nie wydanego, ale trunk jest dość stabilny) możesz użyć następującej metody. Opiera się na fakcie, że AdminSite zwraca teraz TemplateResponse, którą możesz zmienić przed renderowaniem.
Tutaj robimy małe poprawki małpy, aby wstawić nasze zachowanie, którego można uniknąć, jeśli używasz niestandardowej podklasy AdminSite.
from functools import wraps
def rename_app_list(func):
m ={'Sites':'Web sites','Your_app_label':'Nicer app label',}@wraps(func)def _wrapper(*args,**kwargs):
response = func(*args,**kwargs)
app_list = response.context_data.get('app_list')if app_list isnotNone:for a in app_list:
name = a['name']
a['name']= m.get(name, name)
title = response.context_data.get('title')if title isnotNone:
app_label = title.split(' ')[0]if app_label in m:
response.context_data['title']="%s administration"% m[app_label]return response
return _wrapper
admin.site.__class__.index = rename_app_list(admin.site.__class__.index)
admin.site.__class__.app_index = rename_app_list(admin.site.__class__.app_index)
Naprawia to indeks i widoki app_index. Nie naprawia okruchów chleba we wszystkich innych widokach administratora.
Tylko kilka pedantycznych uwag dodatkowych: utworzenie pliku o nazwie apps.pynie jest obowiązkowe. Każda nazwa jest w porządku (ale musisz się do niej odwoływać __init__.py). Jak już wspomniano w innych komentarzach, ten kod działa dla django> = 1.7 ( docs.djangoproject.com/en/1.7/ref/applications/ ... ).
furins
Działa dobrze, ale kod w pliku init .py nie jest wymagany, jeśli zainstalujesz aplikację jako przykład rekomendacji Django w INTALLED_APPS: „Nazwa_aplikacji.apps.AppnameConfig”
Roberth Solís
6
Nie, ale możesz skopiować szablon administratora i zdefiniować tam nazwę aplikacji.
Masz verbose_name, ale chcesz również dostosować app_label do innego wyświetlania w panelu administracyjnym. Niestety posiadanie dowolnego ciągu znaków (ze spacjami) nie działa, a i tak nie jest do wyświetlenia.
Okazuje się, że administrator używa app_label. title () do wyświetlenia, abyśmy mogli zrobić małą podklasę: str z nadpisaną metodą title:
classStuff(models.Model):classMeta:
app_label = string_with_title("stuffapp","The stuff box")# 'stuffapp' is the name of the django app
verbose_name ='The stuff'
verbose_name_plural ='The bunch of stuff'
a administrator pokaże „Pole rzeczy” jako nazwę aplikacji.
Jeśli masz już istniejące tabele używające starej nazwy aplikacji i nie chcesz ich migrować, po prostu ustaw app_label na serwerze proxy oryginalnego modelu.
Pamiętaj, że adres URL to / admin / NewAPPname / mynewmodel /, więc możesz po prostu upewnić się, że nazwa klasy dla nowego modelu wygląda jak najbliżej starego modelu.
Poniższy fragment kodu typu plug-and-play działa doskonale od tego czasu Django 1.7. Wszystko, co musisz zrobić, to skopiować poniższy kod do __init__.pypliku konkretnej aplikacji i zmienić VERBOSE_APP_NAMEparametr.
from os import path
from django.apps importAppConfig
VERBOSE_APP_NAME ="YOUR VERBOSE APP NAME HERE"def get_current_app_name(file):return path.dirname(file).replace('\\','/').split('/')[-1]classAppVerboseNameConfig(AppConfig):
name = get_current_app_name(__file__)
verbose_name = VERBOSE_APP_NAME
default_app_config = get_current_app_name(__file__)+'.__init__.AppVerboseNameConfig'
Jeśli używasz tego do wielu aplikacji, powinieneś rozłożyć get_current_app_namefunkcję na plik pomocniczy.
Odpowiedzi:
Django 1.8+
Zgodnie z dokumentami 1.8 (i aktualnymi dokumentami ),
Przykład:
Następnie zmień swój
AppConfig
zgodnie z poniższą listą.Django 1.7
Jak stwierdzono w komentarzu rhunwicks do OP, jest to teraz możliwe po wyjęciu z pudełka od wersji Django 1.7
Zaczerpnięte z dokumentów :
następnie ustaw
default_app_config
zmienną naYourAppConfig
Przed Django 1.7
Możesz nadać aplikacji niestandardową nazwę, definiując app_label w definicji modelu. Ale gdy django buduje stronę administratora, będzie haszowało modele według ich etykiety_aplikacji, więc jeśli chcesz, aby pojawiały się w jednej aplikacji, musisz zdefiniować tę nazwę we wszystkich modelach aplikacji.
źródło
Jak stwierdzono w komentarzu rhunwicks do OP, jest to teraz możliwe po wyjęciu z pudełka od wersji Django 1.7
Zaczerpnięte z dokumentów :
następnie ustaw
default_app_config
zmienną naYourAppConfig
źródło
Jeśli masz więcej niż jeden model w aplikacji, po prostu utwórz model z informacjami Meta i utwórz podklasy tej klasy dla wszystkich swoich modeli.
źródło
Nadaj im właściwość verbose_name.
Nie rób sobie nadziei. Będziesz także musiał skopiować widok indeksu z django.contrib.admin.sites do własnego widoku ProjectAdminSite i dołączyć go do własnej niestandardowej instancji administratora:
następnie dostosuj skopiowany widok, aby używał Twojej właściwości verbose_name jako etykiety aplikacji.
Zrobiłem to, dodając coś takiego do skopiowanego widoku:
Podczas dostosowywania widoku indeksu, dlaczego nie dodać również właściwości „order”.
źródło
Cóż, uruchomiłem aplikację o nazwie todo i zdecydowałem, że chcę, aby nazywała się Zadania . Problem polega na tym, że mam już dane w mojej tabeli, więc moja praca była następująca. Umieszczone w models.py:
Mam nadzieję, że to pomoże.
źródło
W przypadku Django 1.4 (jeszcze nie wydanego, ale trunk jest dość stabilny) możesz użyć następującej metody. Opiera się na fakcie, że AdminSite zwraca teraz TemplateResponse, którą możesz zmienić przed renderowaniem.
Tutaj robimy małe poprawki małpy, aby wstawić nasze zachowanie, którego można uniknąć, jeśli używasz niestandardowej podklasy AdminSite.
Naprawia to indeks i widoki app_index. Nie naprawia okruchów chleba we wszystkich innych widokach administratora.
źródło
Najpierw musisz utworzyć taki
apps.py
plik w swoim folderze aplikacji:Aby domyślnie załadować tę podklasę AppConfig:
To najlepszy sposób. testowane na Django 1.7
Dla osoby, która miała problemy z językiem hiszpańskim
Ten kod umożliwia kompatybilność utf-8 ze skryptami python2
źródło
apps.py
nie jest obowiązkowe. Każda nazwa jest w porządku (ale musisz się do niej odwoływać__init__.py
). Jak już wspomniano w innych komentarzach, ten kod działa dla django> = 1.7 ( docs.djangoproject.com/en/1.7/ref/applications/ ... ).Nie, ale możesz skopiować szablon administratora i zdefiniować tam nazwę aplikacji.
źródło
Istnieje hack, który można zrobić, który nie wymaga żadnych migracji. Zaczerpnięte z bloga Ionela i należą do niego: http://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/
Istnieje również bilet na to, który powinien zostać naprawiony w Django 1.7 https://code.djangoproject.com/ticket/3591
„” ”
Załóżmy, że masz taki model:
Masz verbose_name, ale chcesz również dostosować app_label do innego wyświetlania w panelu administracyjnym. Niestety posiadanie dowolnego ciągu znaków (ze spacjami) nie działa, a i tak nie jest do wyświetlenia.
Okazuje się, że administrator używa app_label. title () do wyświetlenia, abyśmy mogli zrobić małą podklasę: str z nadpisaną metodą title:
Teraz możemy mieć taki model:
a administrator pokaże „Pole rzeczy” jako nazwę aplikacji.
„” ”
źródło
Jeśli masz już istniejące tabele używające starej nazwy aplikacji i nie chcesz ich migrować, po prostu ustaw app_label na serwerze proxy oryginalnego modelu.
Następnie musisz tylko zmienić to w swoim admin.py:
Pamiętaj, że adres URL to / admin / NewAPPname / mynewmodel /, więc możesz po prostu upewnić się, że nazwa klasy dla nowego modelu wygląda jak najbliżej starego modelu.
źródło
Cóż, to działa dla mnie. W app.py użyj tego:
W setting.py dodaj nazwę aplikacji i nazwę klasy obecną w pliku app.py w folderze aplikacji
]
źródło
Poniższy fragment kodu typu plug-and-play działa doskonale od tego czasu
Django 1.7
. Wszystko, co musisz zrobić, to skopiować poniższy kod do__init__.py
pliku konkretnej aplikacji i zmienićVERBOSE_APP_NAME
parametr.Jeśli używasz tego do wielu aplikacji, powinieneś rozłożyć
get_current_app_name
funkcję na plik pomocniczy.źródło