Как я могу передать объекты в пользовательский тег шаблона django?Я придумал способ, но, кажется, хакерский - PullRequest
2 голосов
/ 19 июня 2011

OK.Я пишу систему, в которой пользователи могут «выбрать победителя».У меня есть таблица «matchup» и таблица «picks».На веб-странице сопоставления я загружаю все сопоставления за этот день в контекст вместе со всеми выборками за этот день.

Теперь мне нужно отобразить изображения с галочками рядом с вариантами, чтобы пользователь мог«выбрать» этот пункт (точно так же, как проверка «лучший ответ» при переполнении стека) Чтобы увидеть, какие проверки должны быть в нижнем (выбранном) состоянии (или в верхнем состоянии, или в «выигранном состоянии» или «потерянном состоянии»)Я создаю тег шаблона.

Вот соответствующий фрагмент из шаблона

  3 {% load matchup_tags %}
  4 
  5 {% for matchup in matchups %}
  6     <div class="grid_6" style="margin-top:15px; border:1px solid black;">
  7 
  8             <div class="div-status"><span class="game-status">{{matchup.status}}</span></div>
  9             <div class="opt1">
 10                 <div class="pick-home {% get_check matchup picks %}">

Как видите, тег шаблона get_check выполняется в цикле.Я передаю текущее совпадение вместе со списком выбора для этого тега шаблона.

Вот моя «взломанная» попытка тега шаблона

  1 from django.template import Library, Node
  2 from matchup.models import *
  3 
  4 register = Library()
  5 
  6 class PickerNode(Node):
  7     def __init__( self , matchup , picks ):
  8         self.matchup , self.picks = matchup , picks
  9         
 10     def render(self, context):
 11         p = context['picks']
 12         return p[0].pick
 13     
 14 def get_check(parser, token):
 15     bits = token.contents.split()
 16     return PickerNode( bits[1] , bits[2] )
 17 
 18 get_check = register.tag(get_check)

Если вы посмотрите на строку 12 измой шаблонный тег, я использую переменную контекста вместо переменной bits [2] (выбирает, которая была передана из моего представления как «выбирает»).

Могу ли я передавать объекты в теги моего шаблона?И зачем мне вообще беспокоиться, если я могу просто получить доступ к объекту в контексте.

Редактировать: Раньше вместо использования контекста я делал что-то вроде «return self.picks.pick», и он бросалкакой-то "unicode не содержит свойства" pick "" ошибка

Cheers!

Ответы [ 4 ]

4 голосов
/ 19 июня 2011

Ты делаешь это сложнее, чем нужно. Лучший способ сделать это - использовать фильтр, а не тег. Фильтры получают уже переданные им значения связанных с ними переменных:

@register.filter
def get_check(matchup, picks):
   # your logic here


{{ matchup|get_check:picks }}
3 голосов
/ 19 июня 2011

Я создал приложение, которое делает именно то, что вы пытаетесь сделать.Это еще не многоразовое состояние, но я выполнил то, что вы пытаетесь сделать, с помощью следующего:

@register.simple_tag
def tipped(registration, match, team):
    try:
        tip = get_tip(registration, match)
        if tip.winner == team:
            return "selected"
    except Exception,e:
        pass
    return ""

и шаблона:

<input type="submit" value="{{ match.home_team.display_name }}" class="button {% tipped registration match match.home_team %}"/>
0 голосов
/ 10 марта 2015

Похоже, вы не далеко от знака. В этом разделе документации Django показано использование

template.Variable(string_token_passed_to_tag)
0 голосов
/ 14 ноября 2013

В моем случае мне понадобился объект непосредственно в пользовательском теге, а не в пользовательском фильтре. Эта статья помогла мне:

http://codespatter.com/2009/01/22/how-to-write-django-template-tags/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...