Использовать варианты из моделей в теге шаблона - PullRequest
0 голосов
/ 11 октября 2009

У меня есть модель с кучей вариантов, которые в БД настроены, как показано ниже.

COL_CHOICES =(
            (1, 'Not Applicable'),
            (2, 'Black'),
        )

COL2_CHOICES =(
            (1, 'Green'),
            (2, 'Blue'),
        )

и т.д.

Я хочу отобразить все эти параметры как меню в моих шаблонах (для использования в качестве меню). Поскольку эти параметры хранятся в коде, нет смысла запрашивать БД. Что было бы лучшим способом сделать их доступными?

Они должны быть доступны на всех страницах, шаблонные теги были бы подходящим вариантом. Однако как будет выглядеть тег шаблона?

Обновление Я пробовал тег шаблона FFQ:

class OptionsNode(Node):
    def __init__(self, colours, varname):
        self.colours = colours
        self.varname = varname

    def render(self, context):
        context[self.varname] = self.colours
        return ''

def get_options(parser, token):
    return OptionsNode(COLOUR_CHOICES, 'colour')

Update2 Таким образом, приведенный выше код работает, и вы получаете доступ к значениям, используя colour.1 / colour.2 и т. Д. Для каждого значения соответственно.

Полный ответ см. Ниже

Ответы [ 2 ]

0 голосов
/ 12 октября 2009

Поскольку никто не опубликовал достаточно ответа, вот оно, если вы хотите сделать что-то подобное. Если кто-нибудь может придумать более эффективный способ сделать это, я был бы рад услышать это. :

Вам необходимо импортировать ваш выбор из файла моделей.

class OptionsNode(Node):
    def __init__(self, options, varname):
        self.options = options
        self.varname = varname

    def render(self, context):
        context[self.varname] = self.options
        return ''

def get_options(parser, token):
    bits = token.contents.split()

    if len(bits) !=4:
        raise TemplateSyntaxError, "get_options tag takes exactly Four arguments"
    if bits[2] != 'as':
        raise TemplateSyntaxError, "Third argument to get_options tag must be 'as'"
    if bits[1] == 'COL_CHOICES':
        choice = COL_CHOICES 
    return OptionsNode(choice, bits[3])

get_options = register.tag(get_options)

В шаблоне вы используете:

{% get_options your_choices as variable %}
0 голосов
/ 11 октября 2009

Если они в коде, вы можете передать их непосредственно в контекст шаблона:

render_to_response('mytemplate.html', {
                      'col_choices': COL_CHOICES,
                      'col2_choices': COL2_CHOICES
                   })

Редактировать в ответ на комментарий : если вам это нужно на каждой странице, включая общие представления, лучше всего использовать тег шаблона.

...