我正在动态生成一些Django模板代码,以便在未存储的表中显示行 一个Django数据库,没有模型。我知道数据库,如果需要我可以反省,但我不想要 手写代码。
例如,字段PSOPRDEFN.OPRCLASS存储对特定行的可选引用,其中PSCLASSDEFN.OPRID = PSOPRDEFN.OPRCLASS,本质上是外键关系。如果没有关系,PSOPRDEFN.OPRCLASS就有一个' ' (空间字符)。
我还有一个给定PSCLASSDEFN行的页面,其中url是:
url(r'^(?i)permissions/(?P<CLASSID>[A-Z0-9_&]{1,50})/$',
'pssecurity.views.psclassdefn_detail',
name="psclassdefn_detail"),
请注意,?P CLASSID正则表达式不允许对应于存储在PSCLASSDEFN表中的空格 - 我认为限制用户可以放入网址请求的内容更安全。
返回我生成的模板:我想要超链接到该关系(如果存在)。我为自己种植的模板生成器提供了json&#34;指令&#34;表明我想要放入模板中的内容(感谢灵感,django-tables2 ):
....
{
"colname": "LANGUAGE_CD"
},
{
"urlname": "security:psclassdefn_detail",
"colname": "OPRCLASS",
"kwargs": [
{
"colname": "dbr",
"accessor": "dbr"
},
{
"colname": "CLASSID",
"accessor": "inst.OPRCLASS"
}
]
},
...
然后会产生一些相当简单的代码生成:
<div class="row">
<div class="col-xs-6 fieldlabel" title="LANGUAGE_CD" >Language Code</div>
<div class="col-xs-6 fieldvalue text-left _fv_LANGUAGE_CD">{{inst.LANGUAGE_CD}}</div>
</div>
<div class="row">
<div class="col-xs-6 fieldlabel" title="OPRCLASS" >Primary Permission List</div>
<div class="col-xs-6 fieldvalue _fv_OPRCLASS">
{% if inst.OPRCLASS|slugify %}
<a href="{% url 'security:psclassdefn_detail' dbr=dbr CLASSID=inst.OPRCLASS %}">{{inst.OPRCLASS}}</a>
{% endif %}
</div>
</div>
我的问题是,在显示PSOPRDEFN数据的某些时,开始获取随机模板网址解析错误。我最终将它追溯到某些行中的空白OPRCLASS字段。
为了避免这种情况,我首先添加了
{% if inst.OPRCLASS %}
<a ...></a>
{% endif %}
这不起作用,因为该字段不为空,它是空白的(因此与CLASSID正则表达式不匹配)。所以,这是我再次阅读过滤器文档的地方,发现slugify剥离了空白和非alpha。
{% if inst.OPRCLASS | slugify %}
<a ...></a>
{% endif %}
作为一种解决方法。问题是CLASSID只存储了alphanum,但对于其他字段并不总是如此。我不介意在模板生成运行时反省表列定义以查看要执行的操作,但我需要找到一种适当的方法来禁用url反转,仅针对某些行。
问题。是否有更好的过滤器,例如| strip?我想我总能建立自己的过滤器。
更好的是,是否有一个标签可以选择性地捕获NoReverseMatch&#39;模板生成时的异常?
{% try NoReverseMatch %}
<a href="{% url 'security:psclassdefn_detail' dbr=dbr CLASSID=inst.OPRCLASS %}">{{inst.OPRCLASS}}</a>
{% endtry %}
我在描述中如此冗长的原因是因为这不是可以解决使用模型的问题。我也不能手动定制调整模板。在大多数情况下,我发现Django在没有模型的情况下运行良好,但是当几行数据与预期不匹配时,模板中的url反转会非常脆弱。加强它会非常有益。
答案 0 :(得分:1)
您可以将url
标记的结果分配给变量。
{% url 'path.to.view' arg arg2 as the_url %}
{% if the_url %}
<a href="{{ the_url }}">link</a>
{% else %}
No link
{% endif %}
如果反转视图失败,则此语法不会引发异常。