在解决这个问题时,我正在打砖墙。我有一个模板,包含在另一个模板中,但我无法在包含的模板中呈现任何模板变量。我为包含的模板提供了单独的模板标记文件。我现在完全失去了如何解决这个问题。
我希望能够在模板中渲染模型中的字段值(包括图像,简短说明等)。我相当肯定我会以错误的方式解决这个问题。< / 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的回复。
答案 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()
....