Необходимо преобразовать строку в int в шаблоне Django - PullRequest
41 голосов
/ 28 января 2011


Я пытаюсь передать параметры URL в шаблон django следующим образом ...

response = render_to_string('persistConTemplate.html', request.GET)

Это вызывающая строка из моего файла views.py.persistConTemplate.html - это имя моего шаблона, а request.GET - это словарь, содержащий параметры url.

В шаблоне я пытаюсь использовать один из параметров, подобных этому ...

{% for item in (numItems) %}

  item {{item}}

{% endfor %}

numItems - это один из параметров URL, который я отправляю в своем запросе следующим образом ...

http:/someDomain/persistentConTest.html/?numItems=12

Когда я пытаюсь использовать цикл выше, я получаю вывод, подобный этому ...

image 1 image 2

Я ожидаю и хотел бы увидеть слово image напечатанным 12 раз ...

image 1 image2 изображение 3 изображение 4 изображение 5 изображение 6 изображение 7 изображение 8 изображение 9 изображение 10 изображение 11 изображение 12

Может кто-нибудь сказать, что я не так делаю?

Ответы [ 6 ]

108 голосов
/ 13 сентября 2011

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

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

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

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

{{ some_int|slugify }}

РЕДАКТИРОВАТЬ: тем не менее, я согласен с другими, что обычно вы должны делать это в представлении - используйте эти приемы только тогда, когда альтернативы намного хуже.

20 голосов
/ 04 апреля 2013

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

# 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 }}

Это для случаев, когда это не может быть легко сделано в поле зрения.

9 голосов
/ 28 января 2011

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

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

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 %}
3 голосов
/ 28 января 2011

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

Попробуйте это:

ctx = dict(request.GET)
ctx['numItems'] = int(ctx['numItems'])
response = render_to_string('persistConTemplate.html', ctx)
0 голосов
/ 23 мая 2018

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

для целых чисел

{{ value|floatformat:"0" }}

Для значения с плавающей запятой с точностью 2

{{ value|floatformat:"2" }}

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

0 голосов
/ 24 октября 2017

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...