【问题标题】:Django custom template tag throwing an errorDjango 自定义模板标签抛出错误
【发布时间】:2018-03-14 02:56:53
【问题描述】:

我正在尝试使用自定义模板标签,当我尝试获取呈现的页面时它给了我这个错误:

Invalid block tag on line 29: 'get_message_print_tag', expected 'empty' or 'endfor'. Did you forget to register or load this tag?

我正在尝试根据{{message.tags}} 为我的 Flash 消息获取一个简单的标题,并在我的模板中将其设为粗体。我在哪里做错了?

apptags.py:

from django import template
register = template.Library()


def get_message_print_tag(value):
    '''return a string for a message tag depending on the
        message tag that can be displayed bold on the flash message''' 
    if 'danger' in value.lower():
        return 'ERROR'
    elif 'success' in value.lower():
        return 'SUCCESS'
    else:
        return 'NOTE' 

html:

{% load apptags %}

        <div class="bootstrap-iso">
        {% if messages %}
            <div class="messages ">
                {% for message in messages %}
                    <div {% if message.tags %} class="alert {{ message.tags }} alert-dismissible" role="alert" {% endif %}>
                        {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}Error: {% endif %}


                        <strong> {% get_message_print_tag {{message.tags}} %}  </strong>
                        {{ message }}
                        <a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>

                    </div>
                {% endfor %}            
            </div>
        {% endif %}
        </div>

【问题讨论】:

    标签: django django-templates django-template-filters templatetags


    【解决方案1】:

    您应该将装饰器@register.simple_tag 添加到函数中并以这种方式使用它:

    {% get_message_print_tag message.tags %}
    

    而不是

    {% get_message_print_tag {{message.tags}} %}
    

    【讨论】:

    • 我已经尝试过了,但我仍然遇到同样的错误
    • 即使我将{{ message.tags }} 替换为'success' 也会抛出相同的错误,这意味着您提到的不是问题
    • 你指的也是个问题,解决了第一个问题后我意识到了!
    • 是的,你是对的,@register.simple_tag 也不见了。将相应地更新答案。
    【解决方案2】:

    来自 Django 文档:Simple Tags

    为了简化带有多个参数(字符串或模板变量)的标签的创建,并在仅基于输入参数和一些外部信息进行一些处理后返回结果,Django 提供了一个辅助函数simple_tag。这个函数是django.template.Library 的一个方法,它接受一个接受任意数量参数的函数,将它包装在一个渲染函数和上面提到的其他必要位中,并将它注册到模板系统中。

    所以问题只有一行应该在标签的定义之上:

    from django import template
    register = template.Library()
    
    @register.simple_tag
    def get_message_print_tag(value):
        '''return a string for a message tag depending on the
            message tag that can be displayed bold on the flash message''' 
        if 'danger' in value.lower():
            return 'ERROR'
        elif 'success' in value.lower():
            return 'SUCCESS'
        else:
            return 'NOTE' 
    

    【讨论】:

      猜你喜欢
      • 2021-07-13
      • 2015-01-20
      • 2018-07-31
      • 2012-03-15
      • 2014-02-03
      • 2015-12-17
      • 2011-03-31
      • 2011-10-05
      相关资源
      最近更新 更多