Нужно преобразовать строку в 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
Когда я пытаюсь использовать цикл for выше, я получаю вывод вроде этого....
изображение 1 изображение 2
Я ожидаю и хотел бы, чтобы текстовое изображение было напечатано 12 раз...
изображение 1 изображение 2 изображение 3 изображение 4 изображение 5 изображение 6 изображение 7 изображение 8 изображение 9 изображение 10 изображение 11 изображение 12
Кто-нибудь может рассказать мне, что я ошибаюсь?
Ответы
Ответ 1
Да, место для этого находится в представлении.
Мне кажется, что приведенный выше пример не будет работать - вы не можете перебирать целое число.
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 %}
Ответ 2
вы можете принудить 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: я сказал, что согласен с другими, что обычно вы должны делать это в представлении - используйте эти трюки только тогда, когда альтернативы намного хуже.
Ответ 3
Мне нравится создавать настраиваемый фильтр:
# 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 }}
Это относится к случаям, когда это невозможно сделать легко.
Ответ 4
Вы должны добавить код в свое представление, чтобы распаковать параметры GET и преобразовать их в нужные значения. Даже если numItems
было целым числом, синтаксис, который вы показываете, не даст вам нужного вам результата.
Попробуйте следующее:
ctx = dict(request.GET)
ctx['numItems'] = int(ctx['numItems'])
response = render_to_string('persistConTemplate.html', ctx)
Ответ 5
Мое решение - это своего рода хак и очень специфический.
В шаблоне я хочу сравнить процент с 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 %}
Это взломать, но в моем случае этого достаточно. Надеюсь, это поможет другим.