Djangoアプリに管理者全体で使用する詳細な名前を付けることはできますか?


140

Django管理画面に表示されるフィールドとモデルに詳細な名前を付けるのと同じ方法で、アプリにカスタム名を付けることができますか?


4
このチケットはこれに対処します:code.djangoproject.com/ticket/3591。残念ながら、すぐにDjangoに統合されるようには思われません...
Benjamin Wohlwend '12

10
Django 1.7以降、これはそのまま使用できるようになりました-docs.djangoproject.com/en/1.7/ref/applications/…を
rhunwicks

回答:


182

Django 1.8以降

1.8ドキュメントごと(および現在のドキュメント)、

新しいアプリケーションは避けるべきです default_app_configです。代わりに、適切なAppConfigサブクラスへのドットパスをで明示的に構成する必要がありますINSTALLED_APPS

例:

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

次にあなたの AppConfig以下に示すようにを。

Django 1.7

OPへのrhunwicksのコメントで述べたように、これはDjango 1.7以降、箱から出してすぐに可能です。

ドキュメントから取得

# 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 1.7より前

モデル定義でapp_labelを定義することにより、アプリケーションにカスタム名を付けることができます。しかし、djangoが管理ページを構築すると、app_labelによってモデルがハッシュされるため、1つのアプリケーションに表示したい場合は、アプリケーションのすべてのモデルでこの名前を定義する必要があります。

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

12
私はこれで管理に問題がありました。app_labelに大きく依存しているので、名前を変更し始めたとき、それは壊れていました。
Joe J

わかった、app_url:app_nameバインディングを持つdictを持つtemplatagを作成してしまった。
Frost.baka 2011年

58
これは、ユーザーに表示される内容にのみ影響を与えるという意味で、詳細名とは異なります。これは、データベース内のテーブルに名前を付けるために使用されるリテラル文字列です。既存のモデルを変更する場合は、スキーマの移行が必要です。
セリン

6
これは良い解決策ではないと思います。美的でない他の副作用が多すぎます。
David Sanders 14年

この人気のある答えは、Django 1.7以前に必要だったハック/回避策を使用することを推奨しています。1.7以上を使用している場合は、iMaGiNiXが推奨するapps.pyファイルを使用してください。
シャッカー、2015

38

OPへのrhunwicksのコメントで述べたように、これはDjango 1.7以降、箱から出してすぐに可能です。

ドキュメントから取得

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

これはよく中華鍋が、内のコードのinitあなたはINTALLED_APPSでDjangoのrecomendationの一例として、アプリケーションをインストールする場合の.pyファイルは必要ありません:「App_name.apps.AppnameConfig」
Roberthソリス

31

アプリに複数のモデルがある場合は、メタ情報を使用してモデルを作成し、すべてのモデルに対してそのクラスのサブクラスを作成します。

class MyAppModel(models.Model):
    class Meta:
        app_label = 'My App Label'
        abstract = True

class Category(MyAppModel):
     name = models.CharField(max_length=50)

12

それらに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

インデックスビューを調整している間に、 'order'プロパティも追加してみませんか。


12

さて、私はtodoというアプリを開始しましたが、今はそれをTasksという名前にしたいと思いました。問題は、テーブル内に既にデータがあるため、次のようにして私の回避策を実行したことです。models.pyに配置:

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

それが役に立てば幸い。


7

Django 1.4(まだリリースされていませんが、trunkはかなり安定しています)では、次の方法を使用できます。これは、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ビューが修正されます。他のすべての管理ビューのパンくずは修正されません。


7

まず、あなたapps.pyはあなたのアプリフォルダにこのようなファイルを作成する必要があります:

# appName/apps.py

# -*- coding: utf-8 -*-             
from django.apps import AppConfig

class AppNameConfig(AppConfig):
    name = 'appName'
    verbose_name = "app Custom Name"

このAppConfigサブクラスをデフォルトでロードするには:

# appName/__init__.py
default_app_config = 'appName.apps.AppNameConfig'

最善の方法です。Django 1.7でテスト済み

私のカスタムアプリ名

スペイン語でお困りの方へ

このコードは、python2スクリプトでutf-8互換性を有効にします

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

ほんの少しの注意深い補足事項:という名前のファイルの作成apps.pyは必須ではありません。任意の名前で結構です(ただし、で参照する必要があります__init__.py)。他のコメントですでに述べたように、このコードはdjango> = 1.7(docs.djangoproject.com/en/1.7/ref/applications/…)で機能します。
風鈴

これはよく中華鍋が、内のコードのinitあなたはINTALLED_APPSでDjangoのrecomendationの一例として、アプリケーションをインストールする場合の.pyファイルは必要ありません:「App_name.apps.AppnameConfig」
Roberthソリス

6

いいえ。ただし、管理テンプレートをコピーしてアプリ名を定義できます。


3

移行を必要としないハックがあります。アイオネルのブログから取られ、彼にクレジットが送られます: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を使用していることがわかりました。タイトル()を表示して、少しハックできるようにします:オーバーライドされたタイトルメソッドを持つ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'

管理者はアプリ名として「スタッフボックス」を表示します。

「」


2

古いアプリ名を使用する既存のテーブルがすでにあり、それらを移行したくない場合は、元のモデルのプロキシに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 /になることに注意してください。新しいモデルのクラス名が古いモデルにできるだけ近くなるようにしたい場合があります。


1

まあ、これは私にとってはうまくいきます。app.pyでこれを使用します。

class MainConfig(AppConfig):
    name = 'main'
    verbose_name="Fancy Title"

setting.pyに、Appの名前とAppフォルダーのapp.pyファイルに存在するクラス名を追加します

INSTALLED_APPS = [
    'main.apps.MainConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

]


0

次のプラグアンドプレイのコードは、以降完全に機能しDjango 1.7ます。以下のコードを__init__.py特定のアプリのファイルにコピーし、VERBOSE_APP_NAMEパラメーターを変更するだけです。

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'

これを複数のアプリに使用する場合は、get_current_app_name関数をヘルパーファイルに分解する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.