2011-11-24 41 views
6

私たちは、属性の多くは、ハイフンを含む名前が付けられたカスタムデータベース上に構築されたシステム、すなわち持って次のようにこれらのプロパティがテンプレートにアクセスすることはできませんDjangoテンプレート内のハイフンを含む辞書キーにアクセスするにはどうすればよいですか?

user-name 
phone-number 

を:

{{ user-name }} 

Djangoはスローこの例外です。私はすべてのキー(およびサブテーブルキー)をアンダースコアを使用してこれを回避するために変換する必要がないようにしたいと思います。簡単な方法がありますか?

答えて

8

カスタムテンプレートタグは、おそらくオブジェクトを再構成したくない場合にここに移動する唯一の方法です。任意の文字列キーで辞書にアクセスするには、this questionへの答えが良い例です。怠け者のために

あなたがそうのように使用
from django import template 
register = template.Library() 

@register.simple_tag 
def dictKeyLookup(the_dict, key): 
    # Try to fetch from the dict, and if it's not found return an empty string. 
    return the_dict.get(key, '') 

{% dictKeyLookup your_dict_passed_into_context "phone-number" %} 

あなたは任意の文字列名を使用して、オブジェクトの属性にアクセスしたい場合は、以下を使用することができます。

from django import template 
register = template.Library() 

@register.simple_tag 
def attributeLookup(the_object, attribute_name): 
    # Try to fetch from the object, and if it's not found return None. 
    return getattr(the_object, attribute_name, None) 

次のように使用します。

{% attributeLookup your_object_passed_into_context "phone-number" %} 

あなたも、サブ属性のための(「__」のような)文字列の区切り文字のいくつかの並べ替えを思い付くことができますが、

+1

私はこのソリューションを使用しましたが、それはタグからフィルターまでです。ありがとうございました! – jthompson

+0

これは間違いなく動作しますが、dictを値として含むdictの中にあったキーにはどのようにアクセスしますか? – Kim

3

残念ながら、あなたは運が不足している可能性があります。 docsから:

変数名は任意の文字(A-Z)、任意の数字(0-9)、 下線またはドットで構成しなければなりません。

+0

右。私も同様の質問を見つけました:http://stackoverflow.com/questions/2213308/why-cant-i-do-a-hyphen-in-django-template-view – jthompson

1

OrderedDict辞書タイプはダッシュをサポート:-)私は宿題のためにそれを残しておきます: https://docs.python.org/2/library/collections.html#ordereddict-objects

これは、OrderedDictの実装の副作用のようです。以下では、キーの値のペアが実際にセットとして渡されることに注意してください。私はOrderedDictの実装は、この問題を回避するために真のdictキーとしてセットで渡された "キー"を使用しないと確信しています。

これはOrderedDictの実装の副作用であるため、依存したいことではない可能性があります。しかし、それは動作します。

from collections import OrderedDict 

my_dict = OrderedDict([ 
    ('has-dash', 'has dash value'), 
    ('no dash', 'no dash value') 
]) 

print('has-dash: ' + my_dict['has-dash']) 
print('no dash: ' + my_dict['no dash']) 

結果:

has-dash: has dash value 
no dash: no dash value 
関連する問題