Django uygulamasına yönetici genelinde kullanılmak üzere ayrıntılı bir isim verebilir misiniz?


140

Django yöneticisinde görünen alanlara ve modellere ayrıntılı adlar verebildiğiniz gibi, bir uygulamaya özel ad da verebilir misiniz?


4
Bu bilet şu konuyu ele alacaktı: code.djangoproject.com/ticket/3591 . Ne yazık ki, yakında Django'ya entegre edilecek gibi görünmüyor ...
Benjamin Wohlwend

10
Django 1.7'den itibaren bu artık kutudan çıkıyor - bkz. Docs.djangoproject.com/en/1.7/ref/applications/…
rhunwicks

Yanıtlar:


182

Django 1.8+

Başına 1.8 docs (ve şimdiki docs ),

Yeni uygulamalardan kaçınılmalıdır default_app_config. Bunun yerine, uygun bir AppConfigalt sınıfa giden noktalı yolun açıkça yapılandırılması gerekir INSTALLED_APPS.

Misal:

INSTALLED_APPS = [
    # ...snip...
    'yourapp.apps.YourAppConfig',
]

Ardından, AppConfigaş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_configdeğ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'

12
Yönetici ile bu konuda sorun yaşıyordum. O kadar çok app_label bağlıdır ki adı değiştirmeye başladığımda, o şeyleri kırdı.
Joe J

Biliyorum, sonunda app_url: app_name bağlama ile bir dict vardı bir templatag yazma.
Frost.baka

58
Bu, yalnızca kullanıcıya gösterilenleri etkilediği için, ayrıntılı bir adla aynı DEĞİLDİR. Varolan bir modeli değiştiriyorsanız şema geçişi gerektiren veritabanındaki tabloyu adlandırmak için kullanılan değişmez bir dizedir.
Cerin

6
Bunun iyi bir çözüm olduğunu düşünmüyorum. Estetik olmayan çok fazla yan etkisi vardır.
David Sanders

Bu popüler yanıt, Django 1.7'den önce gereken bir kesmek / geçici çözüm kullanmanızı önerir. 1.7 veya üstü bir sürüm kullanıyorsanız, aşağıda iMaGiNiX tarafından önerildiği gibi bir apps.py dosyası kullanın.
shacker

38

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_configdeğişkeniYourAppConfig

# in yourapp/__init__.py
default_app_config = 'yourapp.apps.YourAppConfig'

İyi çalışıyor, ancak uygulamayı INTALLED_APPS'de Django öneri örneği olarak yüklerseniz init .py dosyasındaki kod gerekli değildir: 'App_name.apps.AppnameConfig'
Roberth Solís

31

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)

12

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?


12

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.


7

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.


7

Öncelikle, uygulama apps.pyklasö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

Özel Uygulama Adım

İspanyollarla sorunları olan kişiler için

Bu kod python2 komut dosyalarında utf-8 uyumluluğunu etkinleştirir

# -*- coding: utf-8 -*-

Sadece birkaç bilgiçlik yan not: adlı bir dosya oluşturmak apps.pyzorunlu 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.
furins

İyi çalışıyor, ancak uygulamayı INTALLED_APPS'de Django öneri örneği olarak yüklerseniz init .py dosyasındaki kod gerekli değildir: 'App_name.apps.AppnameConfig'
Roberth Solís

6

Hayır, ancak yönetici şablonunu kopyalayabilir ve uygulama adını burada tanımlayabilirsiniz.


3

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.

"""


2

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.


1

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',

]


0

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_NAMEparametreyi 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_nameişlevi bir yardımcı dosya olarak hesaba katmalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.