Как преобразовать типы данных в язык шаблонов django? [Дубликат]

В то время как , что вызывает NullReferenceExceptions и подходит к avoid / fix , такое исключение было рассмотрено в других ответах, что многие программисты не имеют " t узнал еще, как независимо отлаживать такие исключения во время разработки.

В Visual Studio это обычно легко благодаря Visual Studio Debugger .


Во-первых, убедитесь, что правильная ошибка будет обнаружена - см. . Как разрешить нарушение «Исключение System.NullReferenceException» в VS2010? Примечание1

Затем либо Начать с отладки (F5) , либо Приложить [отладчик VS] к запуску процесса . Иногда может быть полезно использовать Debugger.Break , в котором будет предложено запустить отладчик.

Теперь, когда NullReferenceException выбрано (или необработанно), отладчик остановится ( помните правило, указанное выше?) в строке, на которой произошло исключение. Иногда ошибка может быть легко обнаружена.

Например, в следующей строке единственный код, который может , вызывает исключение, если myString имеет значение null. Это можно проверить, посмотрев окно Watch или выполнив выражения в окне Immediate Window .

var x = myString.Trim();

В более сложных случаях, таких как следуя ниже, вам нужно будет использовать один из методов выше (Watch или Immediate Windows) для проверки выражений, чтобы определить, было ли str1 пустым или если str2 имеет значение null.

var x = str1.Trim() + str2.Trim();

Once , где было выбрано исключение, это обычно тривиально по отношению к разуму назад, чтобы выяснить, где введенное значение null было [неправильно] -

. Найдите время, необходимое для понимания причина исключения. Проверьте нулевые выражения. Проверьте предыдущие выражения, которые могли бы привести к таким нулевым выражениям. Добавьте контрольные точки и, по мере необходимости, пройдите через программу. Используйте отладчик.


1 Если Break on Throws слишком агрессивен и отладчик останавливается на NPE в библиотеке .NET или сторонних разработчиков, Break на User-Unhandled можно использовать для ограничения выловленных исключений. Кроме того, VS2012 представляет Just My Code , который я рекомендую также включить.

Если вы отлаживаете с включенным Just My Code, поведение немного отличается. При включенном Just My Code отладчик игнорирует исключения, связанные с привилегиями обычного языка (CLR) первого шанса, которые выходят за пределы My Code и не проходят через My Code

blockquote>

37
задан Adam Wagner 24 November 2011 в 20:21
поделиться

6 ответов

Да, место для этого в представлении.

Мне кажется, что приведенный выше пример не будет работать - вы не можете перебирать целое число.

numItems = request.GET.get('numItems')

if numItems:
   numItems = range(1, int(numItems)+1)

return direct_to_template(request, "mytemplate.html", {'numItems': numItems})


{% for item in numItems %}
 {{ item }}
{% endfor %}
7
ответ дан Yuji 'Tomita' Tomita 28 August 2018 в 22:19
поделиться

Самый простой способ сделать это - использовать встроенный фильтр floatformat.

Для Integer

{{ value|floatformat:"0" }}

Для значения float с точностью 2

{{ value|floatformat:"2" }}

Он также округляется до ближайшего значения. для более подробной информации вы можете проверить https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#floftwareat .

0
ответ дан Akash 28 August 2018 в 22:19
поделиться

вы можете принудить str к int, используя фильтр добавления

{% for item in numItems|add:"0" %}

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#add

, чтобы принудить int к str просто использовать slugify

{{ some_int|slugify }}

EDIT: я сказал, что согласен с другими, что обычно вы должны делать это в представлении - используйте эти трюки только тогда, когда альтернативы намного хуже.

96
ответ дан aliteralmind 28 August 2018 в 22:19
поделиться

Мне нравится создавать настраиваемый фильтр:

# templatetags/tag_library.py

from django import template

register = template.Library()

@register.filter()
def to_int(value):
    return int(value)

Использование:

{% load tag_library %}
{{ value|to_int }}

Это относится к случаям, когда это нелегко сделать.

17
ответ дан clime 28 August 2018 в 22:19
поделиться

Вы должны добавить код к вашему представлению, чтобы распаковать параметры GET и преобразовать их в нужные значения. Даже если numItems были целыми числами, синтаксис, который вы показываете, не даст вам нужного вам результата.

Попробуйте следующее:

ctx = dict(request.GET)
ctx['numItems'] = int(ctx['numItems'])
response = render_to_string('persistConTemplate.html', ctx)
3
ответ дан Ned Batchelder 28 August 2018 в 22:19
поделиться

Мое решение является своего рода хаком и очень специфичным ..

В шаблоне я хочу сравнить процент с 0,9, и он никогда не достигает 1, но все значения считаются строкой в ​​шаблоне , и нет способа конвертировать строку в float.

Итак, я сделал это:

{% if "0.9" in value %}
...
{% else %}
...
{% endif %}

Если я хочу обнаружить, что какое-то значение превышает 0,8, я должен сделать:

{% if ("0.9" in value) or ("0.8" in value) %}
...
{% else %}
...
{% endif %}

Это взломать, но в моем случае этого достаточно. Надеюсь, это может помочь другим.

0
ответ дан WesternGun 28 August 2018 в 22:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: