麻烦渲染Django中的模板变量

时间:2014-01-07 04:15:18

标签: python django django-templates

在解决这个问题时,我正在打砖墙。我有一个模板,包含在另一个模板中,但我无法在包含的模板中呈现任何模板变量。我为包含的模板提供了单独的模板标记文件。我现在完全失去了如何解决这个问题。

我希望能够在模板中渲染模型中的字段值(包括图像,简短说明等)。我相当肯定我会以错误的方式解决这个问题。< / p>

以下是我的代码:

模特:

class AddOnItem(models.Model):
    base_product = models.ForeignKey(Product)
    base_price = models.DecimalField(max_digits=8, decimal_places=2, default=0.0)
    addon_image = models.ImageField(upload_to='uploads/shop/product/images/', 
            default='uploads/shop/product/images/', help_text='Max width: 450px')
    short_description = models.CharField(max_length=255, blank=True)

    def __unicode__(self):
        return self.base_product.name

模板:

{% load addon_tags %}
{% if items_to_add %}
  {% for items in items_to_add %}
  <div id="addon-container">
    <div id="left-addon" class="addon-container">
        <a href=""><img src="#" class="addon-image"></a>
        <p class="addon-description">{{items.short_description}}</p>
    </div>
  </div>
  {% endfor %}
 {% endif %}

addon_tags.py:

from django import template

from sho.models import AddOnItem

register = template.Library()


@register.inclusion_tag("foo/templates/v/sho/addon.html", takes_context=True)
def add_on_render():
    context['items_to_add'] = AddOnItem()

    return context

我想我做错了很多(我现在的假设)或者我错过了一点点。我已经在这方面工作了好几天,并且反复讨论过这些文档。我完全错过了一些东西,这已成为我的主要阻碍者。任何帮助将不胜感激。

Django 1.4版

编辑: 我最终重写了视图并取消了templatetag。感谢Daniel Roseman和Odif Yltsaeb的回复。

3 个答案:

答案 0 :(得分:1)

1)在帖子中,您要在add_on_render templateag中的上下文中添加空的新项目。

2)我在你的帖子中看不到你正在使用{%add_on_render%} templatetag。你已经创建了templattag,但似乎没有在任何地方使用它。

有点难以理解你到底想要做什么,或者为什么你甚至需要那里的模板标签。

如果你想显示模型字段值,你不需要这个模板以及你在这篇文章的“模板”部分显示的所有内容,可能在你的主模板中很好,我认为,没有显示在你的帖子中。

如果你想使用templatetag,那么这个模板标签应该可以像下面这样参考AddOnItem istance:

@register.inclusion_tag("foo/templates/v/sho/addon.html", takes_context=True)
def add_on_render(item):
    context['items_to_add'] = item

    return context

你可以在像这样的模板中使用它:

{% load addon_tags %}
{% if items_to_add %}
  {% for items in items_to_add %}
  <div id="addon-container">
    <div id="left-addon" class="addon-container">
        <a href=""><img src="#" class="addon-image"></a>
        <p class="addon-description">{% add_on_render items %}</p>
    </div>
  </div>
  {% endfor %}
 {% endif %}

和你的foo / templates / v / sho / addon.html 我想这样:

{{ items_to_add.short_description }}

但是这样做似乎是非常不必要的,因为你可以使用你在“主”模板之外已经拥有的模板代码来实现所有没有templatag的东西。

答案 1 :(得分:1)

您尚未发布试图在中包含标记的模板。我怀疑你根本就没有调用它,因为如果你尝试使用标签,会有一些错误会导致异常。您需要在主模板中的某个位置{% add_on_render %}

正如我所说,但有一些错误。首先,在添加context密钥之前,不要定义items_to_add(作为空字典)。您可以通过一次性完成此操作来快捷方式。

其次,您已将items_to_add设为一个空白的AddOnItem。因此,在您包含的模板中,迭代items_to_add什么都不做。不确定你在那里做什么。也许你想传递所有 AddOnItem实例?

context = {'items_to_add':  AddOnItem.objects.all()}

或者您可能希望按某些条件过滤它们,在这种情况下,您可能希望将这些条件传递给包含标记本身:

def add_on_render(product):
    context = {'items_to_add':  AddOnItem.objects.filter(base_product=product)}

你会从主模板中调用它,如下所示:

{% add_on_render my_product %}

答案 2 :(得分:0)

如果设置“takes_context = True”,则应将上下文作为装饰函数中的第一个参数:

@register.inclusion_tag("foo/templates/v/sho/addon.html", takes_context=True)
def add_on_render(context):
    context['items_to_add'] = AddOnItem()
    ....