Пользовательский тег шаблона Django с parser.compile_filter (tokens [2]) не работает - PullRequest
2 голосов
/ 30 апреля 2010

Я попытался реализовать решение, предложенное Т. Стоуном, в моем вопросе «как сделать, чтобы передать множество параметров для просмотра в django» ([текст ссылки] [1] ).
Я не могу добиться какого-либо результата. Трудно найти информацию о compile_filter(), но, насколько я понимаю, cls(queryset=parser.compile_filter(tokens[2]), template=template) должен отображать шаблон с переменными токенами [2]. Но, похоже, это не сработает.

Вот код моей реализации:
models.py:

class SalesRecord(models.Model):
    name = models.CharField(max_length=100)
    month = models.CharField(max_length=10)
    revenue = models.IntegerField()
    def __unicode__(self):
        return self.name + " - " + self.month + " - " + str(self.revenue)

views.py:

def test(request, *args, **kwargs):
    name = 'John'
    monthly_sales_qs = SalesRecord.objects.filter(name=name)
    print monthly_sales_qs
    return render_to_response('test.html', locals())

mytags.py:

class DataForTag(template.Node):
    @classmethod
    def handle_token(cls, parser, token, template):
        tokens = token.contents.split()
        if tokens[1] != 'for':
                raise template.TemplateSyntaxError("First argument in %r must be 'for'" % tokens[0])

        if len(tokens) == 3:
            return cls(queryset=parser.compile_filter(tokens[2]), template=template)
        else:
            raise template.TemplateSyntaxError("%r tag requires 2 arguments" % tokens[0])

    def __init__(self, queryset=None, template=None):
        self.queryset = queryset
        self.template = template

    def render(self, context):
        return render_to_string(self.template, {'queryset':self.queryset})

@register.tag
def render_data_table(parser, token):
    return DataForTag.handle_token(parser, token, 'testtable.html')

test.html:

{% load mytags %}
{% render_data_table for monthly_sales_qs %}

testtable.html:

<table class="tabledata">
    <tr>
    {% for m in queryset.month %}
        <td>queryset.revenue</td>
     {% endfor %}
     </tr>
</table>

Шаблон просто возвращает пустую страницу. Мне кажется, что набор запросов пуст. У кого-то есть идея, что я делаю не так? (вероятно, некоторые начинающие глупости;)

1 Ответ

1 голос
/ 30 апреля 2010

Mark ...

Пара вещей: я был в спешке на днях, когда я отправил этот код для вас. Внутри метода render переменные должны быть разрешены как таковые ...

def render(self, context):
    qs = self.queryset.resolve(context)
    return render_to_string(self.template, { 'queryset': qs } )

Также в вашем шаблоне это неправильно:

{% for m in queryset.month %}
    <td>queryset.revenue</td>
 {% endfor %}

Во-первых, переменные должны быть обернуты в {{}} как {{ queryset.revenue }}, а во-вторых, вы ничего не делаете со значением m, поэтому цикл for бессмыслен.

Наконец, шаблон, который я показал вам в ответе, найденном в приложении django.contrib.comments. Если вы хотите следовать некоторым существующим / рабочим примерам, я бы порекомендовал проверить теги шаблона комментариев. Множество отличных идей в этом приложении.

...