Django管理画面に表示されるフィールドとモデルに詳細な名前を付けるのと同じ方法で、アプリにカスタム名を付けることができますか?
Django管理画面に表示されるフィールドとモデルに詳細な名前を付けるのと同じ方法で、アプリにカスタム名を付けることができますか?
回答:
Django 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'
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'
それらに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'プロパティも追加してみませんか。
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ビューが修正されます。他のすべての管理ビューのパンくずは修正されません。
まず、あなた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/…)で機能します。
移行を必要としないハックがあります。アイオネルのブログから取られ、彼にクレジットが送られます: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'
管理者はアプリ名として「スタッフボックス」を表示します。
「」
古いアプリ名を使用する既存のテーブルがすでにあり、それらを移行したくない場合は、元のモデルのプロキシに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 /になることに注意してください。新しいモデルのクラス名が古いモデルにできるだけ近くなるようにしたい場合があります。
まあ、これは私にとってはうまくいきます。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',
]
次のプラグアンドプレイのコードは、以降完全に機能し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
関数をヘルパーファイルに分解する必要があります。