Исключения шаблонов NoReverseMatch, за пределами моделей

Я генерирую некоторый код шаблона 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"),
</classid>

Обратите внимание, что регулярное выражение? P CLASSID не позволяет использовать пробелы, которые соответствуют сохранению в таблице PSCLASSDEFN, - я считаю, что это безопаснее, чтобы ограничить то, что пользователь может указать в запросе url.

Вернемся к моему сгенерированному шаблону: я хочу гиперссылку на отношение, если оно существует. Я кормлю свой доморощенный генератор шаблонов json "директива", указывающий, что я хочу поместить в шаблон (спасибо за вдохновение, django-tables2):

....
 {
 "colname": "LANGUAGE_CD"
 },
 {
 "urlname": "security:psclassdefn_detail",
 "colname": "OPRCLASS",
 "kwargs": [
 {
 "colname": "dbr",
 "accessor": "dbr"
 },
 {
 "colname": "CLASSID",
 "accessor": "inst.OPRCLASS"
 }
 ]
 },
 ...

Некоторое довольно тривиальное генерирование кода приводит к:

<div>
 <div title="LANGUAGE_CD">Language Code</div>
 <div>{{inst.LANGUAGE_CD}}</div>
</div>

<div>
 <div title="OPRCLASS">Primary Permission List</div>
 <div>
 {% if inst.OPRCLASS|slugify %}
 <a href="{% url 'security:psclassdefn_detail' dbr=dbr CLASSID=inst.OPRCLASS %}" target="_blank">{{inst.OPRCLASS}}</a>
 {% endif %}
 </div>
</div>

Моя проблема заключается в том, что при получении некоторых данных PSOPRDEFN началось получение случайных ошибок разрешения URL шаблона. В конце концов я отследил его до пустых полей OPRCLASS в некоторых строках.

Чтобы этого избежать, я сначала добавил

{% if inst.OPRCLASS %}

{% endif %}

Это не сработало, потому что поле не пустое, оно пустое (и поэтому не соответствует регулярному выражению CLASSID). Итак, я снова прочитал документы с фильтрами и обнаружил, что slugify выдает пробелы и не-альфы.

{% if inst.OPRCLASS | slugify %}

{% endif %}

Работает, как обходной путь. Проблема в том, что CLASSID хранит только буквенно-цифровой символ, но это не всегда верно для других полей. Я бы не прочь исследовать определение столбца таблицы во время исполнения шаблона, чтобы увидеть, что делать, но мне нужно найти подходящий способ отключить разворот URL, только для некоторых строк.

Вопросов. Есть ли лучший фильтр, например, полоса? Полагаю, я всегда мог создать собственный фильтр.

Еще лучше, есть ли тег для выборочного исключения исключений NoReverseMatch'а во время генерации шаблона?

{% try NoReverseMatch %}
 <a href="{% url 'security:psclassdefn_detail' dbr=dbr CLASSID=inst.OPRCLASS %}" target="_blank">{{inst.OPRCLASS}}</a>
{% endtry %}

Причина, по которой я была настолько подробна в своем описании, состоит в том, что это не то, что можно использовать с использованием моделей. И я не могу настраивать шаблон вручную. Я нахожу, что Django работает очень хорошо без моделей в большинстве случаев, но изменение URL в шаблонах может быть довольно хрупким, когда несколько строк данных не соответствуют ожиданиям. Упрочнение было бы очень полезно.

1 ответ

Вы можете присвоить результат тега url переменной.

{% url 'path.to.view' arg arg2 as the_url %}
{% if the_url %}
<a href="{{ the_url }}" target="_blank">link</a>
{% else %}
No link
{% endif %}

Этот синтаксис не вызывает исключения, если реверсирование представления не выполняется.

licensed under cc by-sa 3.0 with attribution.