在Djang中呈现模板变量时出现问题

2024-10-01 07:19:08 发布

您现在位置:Python中文网/ 问答频道 /正文

要解决这个问题,我真是碰壁了。我有一个包含在其他模板中的模板,但无法在包含的模板中呈现任何模板变量。对于包含的模板,我有一个单独的模板标记文件。我现在完全不知道如何解决这个问题。你知道吗

我想能够从我的模型在模板中呈现字段值(包括一个图像,一个简短的描述,等等),我很肯定我是用错误的方式去做这件事。你知道吗

下面是我的代码:

模型:

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 %}

插件_标签.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的回复。你知道吗


Tags: toaddon模型divadd模板basemodels
3条回答

如果设置“takes\u context=True”,则应将context作为修饰函数中的第一个参数:

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

1)从您的帖子中,您正在向add\on\u render templateag的上下文中添加空的新项。你知道吗

2)我在你的帖子里看不到你在用{%add\u on\u render%}templatetag。您已经创建了templattag,但似乎没有在任何地方使用它。你知道吗

很难理解你到底想做什么,或者为什么需要templatetag。你知道吗

如果你想显示models字段值,你不需要templateag,所有你在这篇文章的“模板”部分显示的东西,都可以很好地在你的主模板中显示,我假设,没有在你的文章中显示。你知道吗

如果您想使用templatetag,那么这个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/加载项.html 希望这样:

{{ items_to_add.short_description }}

但是这样做似乎是非常不必要的,因为不使用templatag,就可以通过使用已经存在于“main”模板之外的模板代码来实现所有这些。你知道吗

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

正如我所说,虽然有几个错误。首先,在添加items_to_add键之前,不要定义context(作为空dict)。你只需一次就可以走捷径。你知道吗

其次,你已经把items_to_add变成了一个单一的、空白的addonime。因此,在包含的模板中,遍历items_to_add什么都不做。不知道你想在那里做什么。也许您想传递所有addonim实例?你知道吗

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 %}

相关问题 更多 >