Как получить доступ к словарным ключам, которые содержат дефисы из шаблона Django? - PullRequest
9 голосов
/ 24 ноября 2011

У нас есть система, построенная на пользовательской базе данных, в которой многие атрибуты имеют имена, содержащие дефисы, например:

user-name
phone-number

Эти свойства не доступны в шаблонах следующим образом:

{{ user-name }}

Джанго бросает исключение для этого. Я хотел бы избежать преобразования всех ключей (и ключей вложенных таблиц) в подчеркивания, чтобы обойти это. Есть ли более простой способ?

Ответы [ 3 ]

8 голосов
/ 24 ноября 2011

Пользовательский тег шаблона, вероятно, единственный способ перейти сюда, если вы не хотите реструктурировать свои объекты.Для доступа к словарям с произвольным строковым ключом ответ на этот вопрос дает хороший пример.

Для ленивых:

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" %}

Вы могли бы даже придумать какой-нибудь строковый разделитель (например, '__') для податрибутов, но я оставлю это для домашней работы: -)

4 голосов
/ 24 ноября 2011

К сожалению, я думаю, вам не повезло. Из документов :

Имена переменных должны состоять из любой буквы (A-Z), любой цифры (0-9), подчеркивание или точка.

1 голос
/ 05 ноября 2017

Типы словаря OrderedDict поддерживают тире: https://docs.python.org/2/library/collections.html#ordereddict-objects

Похоже, это побочный эффект от реализации OrderedDict. Обратите внимание, что пары ключ-значение фактически передаются как наборы. Могу поспорить, что реализация OrderedDict не использует «ключ», переданный в наборе, в качестве истинного ключа, таким образом обойдя эту проблему.

Поскольку это побочный эффект от реализации 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...