是否有一种优雅的方式将{%if ..%}应用于Django中的一大堆标签?

时间:2015-05-18 13:56:46

标签: python xml django django-templates

我正在使用django创建XML文档,并且在查看XSD架构时,可能需要或可能不需要许多标记。

像这样:

<GenericCustomerPaymentDetails>
    <PayPalID>{{purchase.customer.ppid}}</PayPalID>
    <BankAccountNumber>{{purchase.customer.ban}}</BankAccountNumber>
    <SortCode>{{purchase.customer.sc}}</SortCode>
    <CreditCardNumber>{{purchase.customer.ccn}}</CreditCardNumber>
    <BitCoinAddress>{{purchase.customer.bitcoin}}</BitCoinAddress>
</GenericCustomerPaymentDetails>

现在,我知道如何单独指定标签可能存在或不存在(包装在if/endif标签中),但它会使文档大小增加三倍,并且数量增加一倍维护要做到这一点:

<GenericCustomerPaymentDetails>
    {% if purchase.customer.ppid %}
    <PayPalID>{{purchase.customer.ppid}}</PayPalID>
    {% endif %}
    {% if purchase.customer.ban%}
    <BankAccountNumber>{{purchase.customer.ban}}</BankAccountNumber>
    {% endif %}
    {% if purchase.customer.sc %}
    <SortCode>{{purchase.customer.sc}}</SortCode>
    {% endif %}
    {% if purchase.customer.ccn %}
    <CreditCardNumber>{{purchase.customer.ccn}}</CreditCardNumber>
    {% endif %}
    {% if purchase.customer.bitcoin %}
    <BitCoinAddress>{{purchase.customer.bitcoin}}</BitCoinAddress>
    {% endif %}
</GenericCustomerPaymentDetails>

如果有更优雅的方式来做到这一点?有没有办法批量应用if存在于值和标记? (如果解决方案可以容纳stags [自闭标签],则奖励积分)

我能想到的唯一方法是将这些付款方式变成json上的对象列表,如此

purchase.customer:[
    {tag_name:"PayPalID",tag_content:"pay.me.monies@geemail.com"},
    {tag_name:"BitCointAddress",tag_content:"http://blockexplorer.com/address/1PC9aZC4hNX2rmmrt7uHTfYAS3hRbph4UN"},
]

然后循环遍历它们。但这需要额外的数据操作才能进入这种格式,而且我不需要经历这种努力(如果看起来像this那样,如果你已经拥有这样的数据,虽然。)。

1 个答案:

答案 0 :(得分:4)

您可以编写一个自定义筛选器来检查该值是否存在,并使用正确的XML标记对其进行包装。例如:

def default_xml_tag(value, arg):
    if value:
        return "<{0}>{1}</{0}>".format(arg, value)
    else:
        return ""

然后简单地写

{{purchase.customer.ppid | default_xml_tag:"PayPalID" }}

在你的模板中。

有关如何注册过滤器的详细信息,请参阅(优秀)Django docs