Django yöneticisinde görünen alanlara ve modellere ayrıntılı adlar verebildiğiniz gibi, bir uygulamaya özel ad da verebilir misiniz?
Django yöneticisinde görünen alanlara ve modellere ayrıntılı adlar verebildiğiniz gibi, bir uygulamaya özel ad da verebilir misiniz?
Yanıtlar:
Django 1.8+
Başına 1.8 docs (ve şimdiki docs ),
Yeni uygulamalardan kaçınılmalıdır
default_app_config
. Bunun yerine, uygun birAppConfig
alt sınıfa giden noktalı yolun açıkça yapılandırılması gerekirINSTALLED_APPS
.
Misal:
INSTALLED_APPS = [
# ...snip...
'yourapp.apps.YourAppConfig',
]
Ardından, AppConfig
aşağıda listelenen şekilde değiştirin .
Django 1.7
Rhunwicks'in OP'ye yaptığı açıklamada belirtildiği gibi, bu artık Django 1.7'den beri kutudan çıkarıldı
Alındığı docs :
# in yourapp/apps.py
from django.apps import AppConfig
class YourAppConfig(AppConfig):
name = 'yourapp'
verbose_name = 'Fancy Title'
sonra default_app_config
değişkeniYourAppConfig
# in yourapp/__init__.py
default_app_config = 'yourapp.apps.YourAppConfig'
Django 1.7 öncesi
Model tanımınızda app_label tanımlayarak uygulamanıza özel bir ad verebilirsiniz. Ancak django yönetici sayfasını oluştururken, app_label'lerine göre karma modeller oluşturacaktır, bu yüzden bir uygulamada görünmelerini istiyorsanız, bu adı uygulamanızın tüm modellerinde tanımlamanız gerekir.
class MyModel(models.Model):
pass
class Meta:
app_label = 'My APP name'
Rhunwicks'in OP'ye yaptığı açıklamada belirtildiği gibi, bu artık Django 1.7'den beri kutudan çıkarıldı
Dokümanlardan alındı :
# in yourapp/apps.py
from django.apps import AppConfig
class YourAppConfig(AppConfig):
name = 'yourapp'
verbose_name = 'Fancy Title'
sonra default_app_config
değişkeniYourAppConfig
# in yourapp/__init__.py
default_app_config = 'yourapp.apps.YourAppConfig'
Uygulamada birden fazla modeliniz varsa, Meta bilgileri içeren bir model oluşturun ve tüm modelleriniz için bu sınıfın alt sınıflarını oluşturun.
class MyAppModel(models.Model):
class Meta:
app_label = 'My App Label'
abstract = True
class Category(MyAppModel):
name = models.CharField(max_length=50)
Onlara ayrıntılı bir isim verin.
Umutlarını kaldırma. Ayrıca, dizin görünümünü django.contrib.admin.sites adresinden kendi ProjectAdminSite görünümünüze kopyalamanız ve kendi özel yönetici örneğinize eklemeniz gerekir:
class ProjectAdminSite(AdminSite):
def index(self, request, extra_context=None):
copied stuff here...
admin.site = ProjectAdminSite()
daha sonra kopyalanan görünümü, uygulama için etiket olarak verbose_name özelliğinizi kullanacak şekilde düzenleyin.
Kopyalanan görünüme böyle bir şey ekleyerek yaptım:
try:
app_name = model_admin.verbose_name
except AttributeError:
app_name = app_label
Dizin görünümünü değiştirirken neden 'order' özelliği de eklemiyorsunuz?
Todo adlı bir uygulamaya başladım ve şimdi Görevler olarak adlandırılmasını istediğime karar verdim . Sorun, zaten benim tablo içinde veri var, bu yüzden etrafında benim çalışma aşağıdaki gibi oldu. Modellere yerleştirilmiştir.
class Meta:
app_label = 'Tasks'
db_table = 'mytodo_todo'
Umarım yardımcı olur.
Django 1.4 için (henüz yayınlanmadı, ancak gövde oldukça kararlı), aşağıdaki yöntemi kullanabilirsiniz. AdminSite'ın artık oluşturulmadan önce değiştirebileceğiniz bir TemplateResponse döndürdüğüne güveniyor.
Burada, özel bir AdminSite alt sınıfı kullanırsanız kaçınılması gereken davranışımızı eklemek için küçük bir maymun yaması yapıyoruz.
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 is not None:
for a in app_list:
name = a['name']
a['name'] = m.get(name, name)
title = response.context_data.get('title')
if title is not None:
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)
Bu, dizini ve app_index görünümlerini düzeltir. Ekmek kırıntılarını diğer tüm yönetici görünümlerinde düzeltmez.
Öncelikle, uygulama apps.py
klasörünüzde böyle bir dosya oluşturmanız gerekir :
# appName/apps.py
# -*- coding: utf-8 -*-
from django.apps import AppConfig
class AppNameConfig(AppConfig):
name = 'appName'
verbose_name = "app Custom Name"
Bu AppConfig alt sınıfını varsayılan olarak yüklemek için:
# appName/__init__.py
default_app_config = 'appName.apps.AppNameConfig'
Bunu yapmanın en iyi yolu. Django 1.7 üzerinde test edildi
İspanyollarla sorunları olan kişiler için
Bu kod python2 komut dosyalarında utf-8 uyumluluğunu etkinleştirir
# -*- coding: utf-8 -*-
apps.py
zorunlu değildir. Herhangi bir isim iyidir (ancak buna başvurmanız gerekir __init__.py
). Diğer yorumlarda belirtildiği gibi, bu kod django> = 1.7 ( docs.djangoproject.com/en/1.7/ref/applications/… ) için çalışır.
Herhangi bir taşıma gerektirmeyen bir kesmek var. Ionel'in blogundan alınan kredi ve kredi: http://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/
Bunun için Django 1.7'de düzeltilmesi gereken bir bilet de var https://code.djangoproject.com/ticket/3591
"""
Diyelim ki böyle bir modeliniz var:
class Stuff(models.Model):
class Meta:
verbose_name = u'The stuff'
verbose_name_plural = u'The bunch of stuff'
Ayrıntılı_adınız var, ancak admin'deki farklı ekranlar için de app_label öğesini özelleştirmek istiyorsunuz. Ne yazık ki bazı boşluklar (boşluklarla) olması işe yaramaz ve yine de görüntülenmek için değildir.
Yöneticinin app_label kullandığını gösterir. başlık için () küçük bir hack yapabiliriz: overriden başlık yöntemiyle str alt sınıfı:
class string_with_title(str):
def __new__(cls, value, title):
instance = str.__new__(cls, value)
instance._title = title
return instance
def title(self):
return self._title
__copy__ = lambda self: self
__deepcopy__ = lambda self, memodict: self
Şimdi böyle bir modele sahip olabiliriz:
class Stuff(models.Model):
class Meta:
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'
ve yönetici uygulama adı olarak "Malzeme kutusu" nu gösterir.
"""
Eski uygulama adını kullanan mevcut tablolarınız varsa ve bunları taşımak istemiyorsanız, app_label dosyasını orijinal modelin proxy'sine ayarlamanız yeterlidir.
class MyOldModel(models.Model):
pass
class MyNewModel(MyOldModel):
class Meta:
proxy = True
app_label = 'New APP name'
verbose_name = MyOldModel._meta.verbose_name
Ardından bunu admin.py adresinizde değiştirmeniz yeterlidir:
#admin.site.register(MyOldModel, MyOldModelAdmin)
admin.site.register(MyNewModel, MyOldModelAdmin)
URL'nin / admin / NewAPPname / mynewmodel / olacağını unutmayın, böylece yeni modelin sınıf adının eski modele olabildiğince yakın göründüğünden emin olmak isteyebilirsiniz.
Bu benim için işe yarıyor. App.py dosyasında bunu kullanın:
class MainConfig(AppConfig):
name = 'main'
verbose_name="Fancy Title"
Setting.py uygulamasında Uygulama adını ve Uygulama klasöründeki app.py dosyasında bulunan sınıf adını ekleyin
INSTALLED_APPS = [
'main.apps.MainConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Aşağıdaki tak ve çalıştır kod parçası mükemmel şekilde çalışıyor Django 1.7
. Tek yapmanız gereken __init__.py
, belirli bir uygulamanın dosyasına aşağıdaki kodu kopyalamak ve VERBOSE_APP_NAME
parametreyi değiştirmek .
from os import path
from django.apps import AppConfig
VERBOSE_APP_NAME = "YOUR VERBOSE APP NAME HERE"
def get_current_app_name(file):
return path.dirname(file).replace('\\', '/').split('/')[-1]
class AppVerboseNameConfig(AppConfig):
name = get_current_app_name(__file__)
verbose_name = VERBOSE_APP_NAME
default_app_config = get_current_app_name(__file__) + '.__init__.AppVerboseNameConfig'
Bunu birden fazla uygulama için kullanıyorsanız, get_current_app_name
işlevi bir yardımcı dosya olarak hesaba katmalısınız.