it-swarm.com.ru

Нужно преобразовать строку в int в шаблоне Django


Я пытаюсь передать параметры 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

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

изображение 1 изображение 2

Я ожидаю и хотел бы, чтобы изображение Word было напечатано 12 раз ...

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

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

39
user479808

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

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

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 %}
8
Yuji 'Tomita' Tomita

вы можете привести 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 }}

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

105
scytale

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

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

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

20
clime

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

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

ctx = dict(request.GET)
ctx['numItems'] = int(ctx['numItems'])
response = render_to_string('persistConTemplate.html', ctx)
3
Ned Batchelder

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

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

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

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

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

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

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

0
WesternGun

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

Для целых

{{ value|floatformat:"0" }}

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

{{ value|floatformat:"2" }}

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

0
Akash