模板之外的模板NoReverseMatch异常

时间:2014-12-12 20:19:48

标签: django templates exception

我正在动态生成一些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反转会非常脆弱。加强它会非常有益。

1 个答案:

答案 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 %}

如果反转视图失败,则此语法不会引发异常。