我正在使用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那样,如果你已经拥有这样的数据,虽然。)。
答案 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。