python - tutorial - 你可以給Django應用程序一個詳細的名稱以供整個管理員使用嗎?




python django範例 (8)

在Django之前1.7

您可以通過在模型定義中定義app_label來為應用程序提供自定義名稱。 但是,由於django構建管理頁面,它會通過app_label對模型進行散列,因此如果您希望它們出現在一個應用程序中,則必須在應用程序的所有模型中定義該名稱。

class MyModel(models.Model):
        pass
    class Meta:
        app_label = 'My APP name'

Django 1.7+

正如rhunwicks對OP的評論所述,現在可以在Django 1.7以後開箱了

docs.djangoproject.com/en/1.7/ref/applications/…

# in yourapp/apps.py
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    name = 'yourapp'
    verbose_name = 'Fancy Title'

然後將default_app_config變量設置為YourAppConfig

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

以同樣的方式,您可以給出出現在Django管理員中的字段和模型名稱,您可以給應用程序定制一個名稱嗎?


不,但您可以復制管理員模板並在那裡定義應用程序名稱。


如果您已經有使用舊應用程序名稱的現有表格,並且您不想遷移它們,那麼只需將app_label設置為原始模型的代理即可。

class MyOldModel(models.Model):
    pass

class MyNewModel(MyOldModel):
    class Meta:
        proxy = True
        app_label = 'New APP name'
        verbose_name = MyOldModel._meta.verbose_name

那麼你只需要在你的admin.py中改變它:

#admin.site.register(MyOldModel, MyOldModelAdmin)
admin.site.register(MyNewModel, MyOldModelAdmin)

請注意,URL將為/ admin / NewAPPname / mynewmodel /,因此您可能只想確保新模型的類名盡可能接近舊模型。


對於Django 1.4(尚未發布,但主幹非常穩定),您可以使用以下方法。 它依賴於AdminSite現在返回一個TemplateResponse,您可以在它被呈現之前進行更改。

在這裡,我們做一些猴子補丁來插入我們的行為,如果您使用自定義的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 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)

這修復了索引和app_index視圖。 它不會修復所有其他管理視圖中的麵包屑。



有一件事可以做,不需要任何遷移。 從Ionel的博客和信用採取他: http://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/ : http://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/

還有一個應該在Django 1.7中修復的票據https://code.djangoproject.com/ticket/3591

“”“

假設你有這樣的模型:

class Stuff(models.Model):
    class Meta:
        verbose_name = u'The stuff'
        verbose_name_plural = u'The bunch of stuff'

你有verbose_name,但是你也想為admin中的不同顯示定制app_label。 不幸的是,有一些任意的字符串(包含空格)不起作用,它不適用於顯示。

原來,管理員使用app_label。 title()以便顯示,所以我們可以做一個小小的hack:str子類,帶重寫標題方法:

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

現在我們可以有這樣的模型:

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'

並且管理員將顯示“The stuff box”作為應用程序名稱。

“”“


給他們一個verbose_name屬性。

不要期待你的希望。 您還需要將django.contrib.admin.sites中的索引視圖複製到您自己的ProjectAdminSite視圖中,並將其包含在您自己的自定義管理實例中:

class ProjectAdminSite(AdminSite):
    def index(self, request, extra_context=None):
        copied stuff here...

admin.site = ProjectAdminSite()

然後調整復制的視圖,以便它使用verbose_name屬性作為應用程序的標籤。

我通過在復制的視圖中添加了一些類似的內容來實現它:

        try:
            app_name = model_admin.verbose_name
        except AttributeError:
            app_name = app_label

當您調整索引視圖時,為什麼不添加'訂單'屬性。


那麼我開始了一個名為todo的應用程序,現在我決定將它命名為Tasks 。 問題是我的桌子裡已經有數據了,所以我的工作如下。 放入models.py:

    class Meta:
       app_label = 'Tasks'
       db_table = 'mytodo_todo'

希望能幫助到你。





django