2011-12-28 5 views
0

私は、あまりにも多くのものを変更することなく、オープンソースのアプリケーションの管理インデックスをカスタマイズしようとしています。管理インデックスのカスタマイズ:モデルの元の名前を取得することは可能ですか?

私は、app_list.modelsに含まれるモデルの名前を確認するだけで、簡単に必要なことができると思っていました。 のような何か:

if model is "interface" or "device": 
    show it 

しかし、私は、Djangoのインスタンスの設定や言語に応じて変更されない値を見つけることができません。私はテンプレートにいくつかの情報を印刷する場合

{{ app_list.1.models.2 }} 

私が手:

{'perms': 
    {'add': True, 'change': True, 'delete': True}, 
    'add_url': '/nodeshot-server/admin/nodeshot/interface/add/', 
    'admin_url': '/nodeshot-server/admin/nodeshot/interface/', 
    'name': <django.utils.functional.__proxy__ object at 0x7f67fced6ed0> 
} 

add_urlとADMIN_URLは設定に依存し、私のローカルインスタンス "nodeshot・サーバー" 上Infactはオンラインの間はプロジェクトのフォルダです "/ admin/nodeshot/ecc"。 名前キーも使用言語に依存するため信頼できません。したがって、言語がイタリア語の場合、名前キーは「インターフェイス」ではなく「インターファッチャ」になります。

ビューを変更せずに、モデルの元の名前(翻訳された名前ではなく)を取得する方法はありますか?私は実際に "django.utils.functional._ proxy"を知っていませんが、遅延評価のためのメカニズムのようです。

もし私が管理者インデックスのカスタムビューを書かなければならないと思われます。そうですか?

+0

?あなたはいくつかのモデルを隠したいですか?ソリューションは失敗したものの、やりたいことではないことだけを伝えています。 –

+0

私はいくつかのモデルを別のテーブルに移動したい。私は基本的にレイアウトを変更したい。 – nemesisdesign

答えて

0

この質問に対する正しい答えは次のとおりです。

は、if節では変更されませんビットを使用します。

{% if '/nodeshot/interface/' in model.admin_url %} 
正確にあなたが達成しようとしている何
1

2つのオプションがあります。まず、はい、あなたは単にAdminSite.indexをオーバーライドし、好きなものをコンテキストに渡すことができます。その方法を使用する場合は、AdminSiteサブクラスを作成して使用し、手動でアプリを登録する必要があります(admin.autodiscover()は機能しなくなります)。

2番目の方法は、提供された情報を利用することです。 admin_urlは文脈によって部分的に変更されることがありますが、最後の部分/nodeshot/interfaceは常にそのアプリとモデルで同じになります。正規表現を使用してこのピースを検索し、それに応じて応答することができます。ただし、その時点でテンプレートを使用しているため、カスタムテンプレートタグまたはフィルタを作成して作業する必要があります。フィルタがおそらくあなたの最良の賭けになるでしょう。モデルのdictを渡してブール値を返すことができ、ifステートメント内で使用できます。各モデルの

nodeshot/templatetags/nodeshot_filters.py

import re 

@register.filter 
def goes_in_different_table(model_dict): 
    if re.search(r'/nodeshot/interface/', model_dict['admin_url']): 
     return True 

    return False 

テンプレート/管理/ app_index.html

{% load nodeshot_filters %} 

{% if model|goes_in_different_table %} 
    <!-- do something --> 
{% endif %} 
+0

あなたの素晴らしい答えをありがとう。私はそれをしなければならないと思ったが、私は間違っていたと思った。 – nemesisdesign

+0

しばらくお待ちください!あなたは正しいので、URLの最後の部分は変更されないので、私はadmin_urlパラメータを使うことができますが、テンプレートタグは必要ありません! 私はできるだけ {%if '/ nodeshot/interface /' in model.admin_url%} どうして私はそれについて考えなかったのですか? URLの一部を使用していただきありがとうございます! – nemesisdesign

0

あなたはできるoverride the admin template。そして、テンプレートファイル全体を複製せず、変更したいテンプレートブロックだけを上書きしてください。

+0

は編集フォームを参照していませんか? – nemesisdesign

関連する問題