【问题标题】:Need to convert a string to int in a django template需要在 django 模板中将字符串转换为 int
【发布时间】:2011-06-17 09:47:48
【问题描述】:


我正在尝试将 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

谁能告诉我我哪里出错了?

【问题讨论】:

  • 您在模板中而不是在视图中这样做的任何特殊原因?
  • 好吧,我试图遵循整个分层方法,但也许正如其他人所建议的那样,处理这个问题的最佳位置是在视图中。

标签: django django-templates


【解决方案1】:

您可以使用添加过滤器将 str 强制转换为 int

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

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

使用 slugify 将 int 强制转换为 str

{{ some_int|slugify }}

编辑:也就是说,我同意其他人的观点,通常您应该在视图中执行此操作 - 仅当替代方案更糟时才使用这些技巧。

【讨论】:

  • 谢谢。处理表格时我很头疼。捕获在“外键”字段中。从数据库“form..value”加载时包含整数。但是在提交“form..value”之后是字符串.... TADÁ!
  • 而不是对 id 进行列表推导......整洁。如此简单。
  • 看来slugify 适合我。现在我只是想知道这个词是什么意思。 Slugify 不在我的词汇表和字典中。
  • 在 django 1.8 上,add:"0" 对我有用,slugify 没有。
  • 使用floatformatintcomma后,add只是附加一个'0'
【解决方案2】:

我喜欢制作自定义过滤器:

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

适用于在视图中不容易做到这一点的情况。

【讨论】:

  • 这比其他答案更干净。
【解决方案3】:

是的,这个位置在视图中。

我觉得上面的例子行不通——你不能迭代一个整数。

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

【讨论】:

  • 感谢您的回复,但是当我尝试这种方式时,我得到了相同的结果.... image 1 image 2
  • 你能发布你的代码吗?此代码有效。我注意到我写的range(1, int(range)+1) 应该是range(1, int(numItems)+1) 的一个小错误(如果您尝试运行它,这应该会引发异常。如果将“numItems”传递给GET,则创建一个从1 到@ 的整数列表987654324@,并在模板中对其进行迭代。
  • Traceback(最近一次调用最后一次):文件“views.py”,第 29 行,在? pprint(persistentConTestPage(req)) 文件“views.py”,第 18 行,在 persistentConTestPage 返回 direct_to_template(request,“persistConTemplate.html”,{'numItems': numItems}) 文件“/usr/lib/python2.4/site -packages/django/views/generic/simple.py",第 16 行,在 direct_to_template c = RequestContext(request, dictionary)
  • 文件“/usr/lib/python2.4/site-packages/django/template/context.py”,第 107 行,在 init self.update(processor( request)) 文件“/usr/lib/python2.4/site-packages/django/core/context_processors.py”,第 34 行,调试中的 settings.DEBUG 和 request.META.get('REMOTE_ADDR') 在设置中。 INTERNAL_IPS:AttributeError:“mockHttpRequest”对象没有属性“META”
  • 当我尝试在本地编译时出现上述错误。我认为这可能是我看到与以前相同的结果的原因。我认为我的 views.py 文件没有被编译...
【解决方案4】:

最简单的方法是使用内置的 floatformat 过滤器。

整数

{{ value|floatformat:"0" }}

对于精度为 2 的浮点值

{{ value|floatformat:"2" }}

它也会四舍五入到最接近的值。更多详情,您可以查看https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#floatformat

【讨论】:

    【解决方案5】:

    您应该在视图中添加一些代码来解压缩 GET 参数并将它们转换为您想要的值。即使numItems 是一个整数,您显示的语法也不会给您想要的输出。

    试试这个:

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

    【讨论】:

    • 感谢您的回复,但我在尝试此操作时收到以下错误... ctx['numObjects'] = int(ctx['numObjects']) KeyError: 'numObjects'
    • 将该行换成if 'numObjects in ctx:`
    【解决方案6】:

    在我的例子中,其中一项是字符串,你不能将字符串与整数进行比较,所以我不得不将字符串强制转换为整数,见下文

    {% if questions.correct_answer|add:"0" == answers.id %}
        <span>Correct</span>
    {% endif %}
    

    【讨论】:

      【解决方案7】:

      我的解决方案有点像 hack 并且非常具体..

      在模板中我想比较一个百分比和0.9,它永远不会达到1,但是模板中的所有值都被认为是字符串,没有办法将字符串转换为浮点数。

      所以我这样做了:

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

      如果我想检测某个值是否超过 0.8,我必须这样做:

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

      这是一个 hack,但在我的情况下就足够了。我希望它可以帮助其他人。

      【讨论】:

        猜你喜欢
        • 2022-01-26
        • 2015-03-02
        • 1970-01-01
        • 2018-06-20
        • 2021-07-23
        • 1970-01-01
        • 2020-11-20
        相关资源
        最近更新 更多