Können Sie einer Django-App einen ausführlichen Namen für die Verwendung im gesamten Administrator geben?
140
Können Sie einer App einen benutzerdefinierten Namen geben, genauso wie Sie Feldern und Modellen ausführliche Namen geben können, die im Django-Administrator angezeigt werden?
Dieses Ticket würde dies ansprechen: code.djangoproject.com/ticket/3591 . Leider scheint es nicht so, als würde es bald in Django integriert werden ...
Neue Anwendungen sollten vermieden werden default_app_config. Stattdessen sollte der gepunktete Pfad zur entsprechenden AppConfigUnterklasse explizit konfiguriert werden müssen INSTALLED_APPS.
# in yourapp/apps.pyfrom django.apps importAppConfigclassYourAppConfig(AppConfig):
name ='yourapp'
verbose_name ='Fancy Title'
Setzen Sie dann die default_app_configVariable aufYourAppConfig
# in yourapp/__init__.py
default_app_config ='yourapp.apps.YourAppConfig'
Vor Django 1.7
Sie können Ihrer Anwendung einen benutzerdefinierten Namen geben, indem Sie app_label in Ihrer Modelldefinition definieren. Da django die Administrationsseite erstellt, werden Modelle anhand ihres app_label gehasht. Wenn Sie also möchten, dass sie in einer Anwendung angezeigt werden, müssen Sie diesen Namen in allen Modellen Ihrer Anwendung definieren.
Ich hatte Probleme damit im Admin. Es hängt so viel vom app_label ab, dass es das Zeug kaputt machte, als ich anfing, den Namen zu ändern.
Joe J
Ich weiß, am Ende habe ich ein Templatag geschrieben, das ein Diktat mit der Bindung app_url: app_name hatte.
Frost.baka
58
Beachten Sie, dass dies NICHT mit einem ausführlichen Namen identisch ist, da er nur das beeinflusst, was dem Benutzer angezeigt wird. Dies ist die Literalzeichenfolge, mit der die Tabelle in der Datenbank benannt wird. Dies erfordert eine Schemamigration, wenn Sie ein vorhandenes Modell ändern.
Cerin
6
Ich denke nicht, dass dies eine gute Lösung ist. Es hat zu viele andere Nebenwirkungen, die nicht ästhetisch sind.
David Sanders
Diese beliebte Antwort empfiehlt die Verwendung eines Hack / Workarounds, der vor Django 1.7 benötigt wurde. Wenn Sie 1.7 oder höher verwenden, verwenden Sie eine apps.py-Datei, wie unten von iMaGiNiX empfohlen.
Shacker
38
Wie aus Rhunwicks 'Kommentar zu OP hervorgeht, ist dies seit Django 1.7 sofort möglich
Es funktioniert gut, aber der Code in der init .py-Datei ist nicht erforderlich, wenn Sie die Anwendung als Django-Empfehlungsbeispiel in INTALLED_APPS installieren: 'App_name.apps.AppnameConfig'
Roberth Solís
31
Wenn Sie mehr als ein Modell in der App haben, erstellen Sie einfach ein Modell mit den Metainformationen und erstellen Sie Unterklassen dieser Klasse für alle Ihre Modelle.
classMyAppModel(models.Model):classMeta:
app_label ='My App Label'
abstract =TrueclassCategory(MyAppModel):
name = models.CharField(max_length=50)
Mach dir keine Hoffnungen. Sie müssen auch die Indexansicht von django.contrib.admin.sites in Ihre eigene ProjectAdminSite-Ansicht kopieren und in Ihre eigene benutzerdefinierte Administratorinstanz aufnehmen:
Nun, ich habe eine App namens todo gestartet und jetzt entschieden, dass sie Aufgaben heißen soll . Das Problem ist, dass ich bereits Daten in meiner Tabelle habe, sodass meine Arbeit wie folgt war. Platziert in der models.py:
Für Django 1.4 (noch nicht veröffentlicht, aber Trunk ist ziemlich stabil) können Sie die folgende Methode verwenden. Es basiert auf der Tatsache, dass AdminSite jetzt eine TemplateResponse zurückgibt, die Sie ändern können, bevor sie gerendert wird.
Hier führen wir ein kleines Affen-Patching durch, um unser Verhalten einzufügen. Dies kann vermieden werden, wenn Sie eine benutzerdefinierte AdminSite-Unterklasse verwenden.
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)
Dadurch werden die Ansichten index und app_index korrigiert. Die Brotkrumen werden in allen anderen Administratoransichten nicht behoben.
Nur ein paar pedantische Randnotizen: Das Erstellen einer Datei mit dem Namen apps.pyist nicht obligatorisch. Jeder Name ist in Ordnung (aber Sie müssen sich in darauf beziehen __init__.py). Wie bereits in anderen Kommentaren erwähnt, funktioniert dieser Code für django> = 1.7 ( docs.djangoproject.com/de/1.7/ref/applications/… ).
Furins
Es funktioniert gut, aber der Code in der init .py-Datei ist nicht erforderlich, wenn Sie die Anwendung als Django-Empfehlungsbeispiel in INTALLED_APPS installieren: 'App_name.apps.AppnameConfig'
Roberth Solís
6
Nein, aber Sie können die Admin-Vorlage kopieren und dort den App-Namen definieren.
Sie haben verbose_name, möchten jedoch auch app_label für eine andere Anzeige in admin anpassen. Leider funktioniert es nicht, eine beliebige Zeichenfolge (mit Leerzeichen) zu haben, und sie wird sowieso nicht angezeigt.
Es stellt sich heraus, dass der Administrator app_label verwendet. title () für die Anzeige, damit wir einen kleinen Hack machen können: str-Unterklasse mit überschriebener title-Methode:
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'
und der Administrator zeigt "The stuff box" als App-Namen an.
Wenn bereits Tabellen mit dem alten App-Namen vorhanden sind und diese nicht migriert werden sollen, legen Sie einfach das app_label auf einem Proxy des Originalmodells fest.
Beachten Sie, dass die URL / admin / NewAPPname / mynewmodel / lautet. Stellen Sie daher möglicherweise nur sicher, dass der Klassenname für das neue Modell dem alten Modell so nahe wie möglich kommt.
Der folgende Plug-and-Play-Code funktioniert seitdem einwandfrei Django 1.7. Sie müssen lediglich den folgenden Code in die __init__.pyDatei der jeweiligen App kopieren und den VERBOSE_APP_NAMEParameter ändern .
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'
Wenn Sie dies für mehrere Apps verwenden, sollten Sie die get_current_app_nameFunktion in eine Hilfsdatei umwandeln.
Antworten:
Django 1.8+
Gemäß den 1.8 Dokumenten (und aktuellen Dokumenten ),
Beispiel:
Ändern Sie dann Ihre
AppConfig
wie unten aufgeführt.Django 1.7
Wie aus Rhunwicks 'Kommentar zu OP hervorgeht, ist dies seit Django 1.7 sofort möglich
Entnommen aus den Dokumenten :
Setzen Sie dann die
default_app_config
Variable aufYourAppConfig
Vor Django 1.7
Sie können Ihrer Anwendung einen benutzerdefinierten Namen geben, indem Sie app_label in Ihrer Modelldefinition definieren. Da django die Administrationsseite erstellt, werden Modelle anhand ihres app_label gehasht. Wenn Sie also möchten, dass sie in einer Anwendung angezeigt werden, müssen Sie diesen Namen in allen Modellen Ihrer Anwendung definieren.
quelle
Wie aus Rhunwicks 'Kommentar zu OP hervorgeht, ist dies seit Django 1.7 sofort möglich
Entnommen aus den Dokumenten :
Setzen Sie dann die
default_app_config
Variable aufYourAppConfig
quelle
Wenn Sie mehr als ein Modell in der App haben, erstellen Sie einfach ein Modell mit den Metainformationen und erstellen Sie Unterklassen dieser Klasse für alle Ihre Modelle.
quelle
Geben Sie ihnen eine verbose_name-Eigenschaft.
Mach dir keine Hoffnungen. Sie müssen auch die Indexansicht von django.contrib.admin.sites in Ihre eigene ProjectAdminSite-Ansicht kopieren und in Ihre eigene benutzerdefinierte Administratorinstanz aufnehmen:
Passen Sie dann die kopierte Ansicht so an, dass Ihre Eigenschaft verbose_name als Bezeichnung für die App verwendet wird.
Ich habe es getan, indem ich der kopierten Ansicht etwas Ähnliches hinzugefügt habe:
Fügen Sie während der Optimierung der Indexansicht auch eine 'order'-Eigenschaft hinzu.
quelle
Nun, ich habe eine App namens todo gestartet und jetzt entschieden, dass sie Aufgaben heißen soll . Das Problem ist, dass ich bereits Daten in meiner Tabelle habe, sodass meine Arbeit wie folgt war. Platziert in der models.py:
Ich hoffe es hilft.
quelle
Für Django 1.4 (noch nicht veröffentlicht, aber Trunk ist ziemlich stabil) können Sie die folgende Methode verwenden. Es basiert auf der Tatsache, dass AdminSite jetzt eine TemplateResponse zurückgibt, die Sie ändern können, bevor sie gerendert wird.
Hier führen wir ein kleines Affen-Patching durch, um unser Verhalten einzufügen. Dies kann vermieden werden, wenn Sie eine benutzerdefinierte AdminSite-Unterklasse verwenden.
Dadurch werden die Ansichten index und app_index korrigiert. Die Brotkrumen werden in allen anderen Administratoransichten nicht behoben.
quelle
Zuerst müssen Sie eine
apps.py
Datei wie diese in Ihrem App-Ordner erstellen:So laden Sie diese AppConfig-Unterklasse standardmäßig:
Ist der beste Weg zu tun. getestet auf Django 1.7
Für die Person, die Probleme mit den Spaniern hatte
Dieser Code aktiviert die utf-8-Kompatibilität für Python2-Skripte
quelle
apps.py
ist nicht obligatorisch. Jeder Name ist in Ordnung (aber Sie müssen sich in darauf beziehen__init__.py
). Wie bereits in anderen Kommentaren erwähnt, funktioniert dieser Code für django> = 1.7 ( docs.djangoproject.com/de/1.7/ref/applications/… ).Nein, aber Sie können die Admin-Vorlage kopieren und dort den App-Namen definieren.
quelle
Es kann ein Hack durchgeführt werden, für den keine Migrationen erforderlich sind. Entnommen aus Ionels Blog und Kredit geht an ihn: http://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/
Es gibt auch ein Ticket dafür, das in Django 1.7 behoben werden sollte https://code.djangoproject.com/ticket/3591
"" "
Angenommen, Sie haben ein Modell wie dieses:
Sie haben verbose_name, möchten jedoch auch app_label für eine andere Anzeige in admin anpassen. Leider funktioniert es nicht, eine beliebige Zeichenfolge (mit Leerzeichen) zu haben, und sie wird sowieso nicht angezeigt.
Es stellt sich heraus, dass der Administrator app_label verwendet. title () für die Anzeige, damit wir einen kleinen Hack machen können: str-Unterklasse mit überschriebener title-Methode:
Jetzt können wir das Modell so haben:
und der Administrator zeigt "The stuff box" als App-Namen an.
"" "
quelle
Wenn bereits Tabellen mit dem alten App-Namen vorhanden sind und diese nicht migriert werden sollen, legen Sie einfach das app_label auf einem Proxy des Originalmodells fest.
Dann müssen Sie dies nur noch in Ihrer admin.py ändern:
Beachten Sie, dass die URL / admin / NewAPPname / mynewmodel / lautet. Stellen Sie daher möglicherweise nur sicher, dass der Klassenname für das neue Modell dem alten Modell so nahe wie möglich kommt.
quelle
Nun, das funktioniert bei mir. Verwenden Sie in der app.py Folgendes:
Fügen Sie in settings.py den Namen der App und den Klassennamen hinzu, der in der Datei app.py im App-Ordner vorhanden ist
]]
quelle
Der folgende Plug-and-Play-Code funktioniert seitdem einwandfrei
Django 1.7
. Sie müssen lediglich den folgenden Code in die__init__.py
Datei der jeweiligen App kopieren und denVERBOSE_APP_NAME
Parameter ändern .Wenn Sie dies für mehrere Apps verwenden, sollten Sie die
get_current_app_name
Funktion in eine Hilfsdatei umwandeln.quelle