如何在Django中创建详细的模板标记?

时间:2010-08-22 10:32:31

标签: django django-templates

我有以下包含标记:

@register.inclusion_tag('bouts/fighter/_fighter_bout_list.html')
def fighter_bout_list(list, header, fighter, has, empty):
    return {
            'list' : list,
            'header': header,
            'fighter': fighter,
            'has' : has,
            'empty' : empty,
    }

要使用它,我可以在我的模板中包含以下内容:

{% fighter_bout_list wins "Wins" fighter "beat" "has no wins!" %}

但是,我想让我的标签可读,以便更容易看到代码在做什么。理想情况下,我想将此用作我的输入:

{% fighter_bout_list list=wins header="Wins" fighter=fighter has="beat" empty="has no wins!" %}

这样做的最佳方式(甚至是一种好方法!)是什么?

1 个答案:

答案 0 :(得分:1)

更改Django模板系统以执行您想要的操作将非常困难;如果你想这样做,首先要完全理解django.template module。坦率地说,我不建议创建一个使用与所有其他现有标签不同的处理参数方式的标签 - 这会让必须使用标签的用户感到困惑。

但是如果你坚持这样做,你只需要让自定义模板标签分别解析其参数以提供服务。这样的事情可以解决问题:

def fixit( argument ):
    """Strip off any leading 'word=' noise words from argument"""
    result = argument.split('=')[-1]
    if result[0] == '"' and result[-1] == '"': 
        result = result[1:-2]
    return result

@register.inclusion_tag('bouts/fighter/_fighter_bout_list.html')
def fighter_bout_list(list, header, fighter, has, empty):
    return {
            'list' : fixit(list),
            'header': fixit(header),
            'fighter': fixit(fighter),
            'has' : fixit(has),
            'empty' : fixit(empty),
    }

<强>被修改

这段代码仍然是位置的 - 我并不是说你可以用它来做真正的关键字参数。我添加了代码来处理引号的存在,但我还没有测试过这个 - 这只是一个建议。

同样,我强烈建议不要采用这种方法。模板标签背后的要点是使用现有的模板标签做一些无法轻松完成的事情,但它仍然是模板的一部分,并且实际上是技术足以使用HTML编辑器的工具。我正在尝试为您建议的标签描绘一个用例,它将在一个站点中使用多次。一些文档和一个示例比在不使用关键字参数的系统中为模板标记实现关键字参数便宜得多。