在模板中留下 FOR 标记后,简单标记丢失设置的值

Posted

技术标签:

【中文标题】在模板中留下 FOR 标记后,简单标记丢失设置的值【英文标题】:Simple tag loosing the value set after leaving a FOR tag in template 【发布时间】:2021-09-11 02:13:15 【问题描述】:

我定义了这个简单的标签并将其加载到我的模板中:

from django import template

@register.simple_tag
def defining(val=None):
    return val

标签有效!

我的目标是,我想使用某个条件在 FOR 循环中使用这个简单的标签为变量设置一个值,然后在离开 FOR 后检查这个变量的值。简单吧?

  % defining 'negative' as var %

  % for anything in some_query_set %
      % if 1 == 1 %

      % defining 'positive' as var %

      % endif %
  % endfor %


  <p>The value of var is: var</p>

问题是:我希望这个变量'var'在离开for之后是'正',但它总是变成'负'。 我在 IF 和 FOR 内部检查了它的值,它按预期变为“正”,但在离开 FOR 后,它又回到“负”。

我可能有一些通过视图使用上下文变量的解决方法,但我确实需要在模板中执行此操作。我也搜索了论坛,但我找不到足够接近的东西来解释为什么会发生这种情况。我错过了什么吗?

我对 Django 有点陌生,所以我尽量避免使用更复杂的方法,谢谢。

【问题讨论】:

拜托不要在模板中写业务逻辑,这属于视图。 这里顺便看一下some_query_set有没有什么项目,可以优雅的处理一下。 【参考方案1】:

我对 Django 有点陌生,所以我尽量避免使用更复杂的方法,谢谢。

不要在模板中这样做。模板应该专注于呈现逻辑,而不是业务逻辑。因此,这意味着视图应该以可访问的格式“准备”数据,并且模板不应该做更多的事情,而不仅仅是迭代数据和呈现这些数据。 Django 的模板语言刻意限制,防止人们编写业务逻辑。

在你看来,你可以简单地写:

from django.shortcuts import render

def my_view(request):
    some_query_set = …
    contains_items = bool(some_query_set)
    context = 
        'some_query_set': some_query_set,
        'var': contains_item
    
    return render(request, 'some-template.html', context)

然后可以用以下方式渲染它:

&lt;p&gt;The value of var is:  <b>var</b> &lt;/p&gt;

【讨论】:

以上是关于在模板中留下 FOR 标记后,简单标记丢失设置的值的主要内容,如果未能解决你的问题,请参考以下文章

Python/Django - 在 for 标记中获取 ManyToManyField 的值

如果 else 标记引发错误,则内部循环标记的字符串

struts2应用程序中的警告:属性标记

sh 从Container Registry中删除所有未标记的容器图像,只留下最新的标记

带有 utf-8 的 php substr() 函数在末尾留下 � 标记

关于时间标记的思考