Need to convert a string to int in a django template

前端 未结 6 976
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-27 04:58


I am trying to pass in url parameters to a django template like this...

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


        
相关标签:
6条回答
  • 2020-11-27 05:40

    you can coerce a str to an int using the add filter

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

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

    to coerce int to str just use slugify

    {{ some_int|slugify }}
    

    EDIT: that said, I agree with the others that normally you should do this in the view - use these tricks only when the alternatives are much worse.

    0 讨论(0)
  • 2020-11-27 05:41

    Yes, the place for this is in the view.

    I feel like the above example won't work -- you can't iterate over an integer.

    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 %}
    
    0 讨论(0)
  • 2020-11-27 05:49

    You should add some code to your view to unpack the GET params and convert them to the values you want. Even if numItems were an integer, the syntax you're showing wouldn't give you the output you want.

    Try this:

    ctx = dict(request.GET)
    ctx['numItems'] = int(ctx['numItems'])
    response = render_to_string('persistConTemplate.html', ctx)
    
    0 讨论(0)
  • 2020-11-27 05:54

    I like making a custom filter:

    # templatetags/tag_library.py
    
    from django import template
    
    register = template.Library()
    
    @register.filter()
    def to_int(value):
        return int(value)
    

    Usage:

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

    It is for cases where this cannot be easily done in view.

    0 讨论(0)
  • 2020-11-27 05:55

    My solution is kind of a hack and very specific..

    In the template I want to compare a percentage with 0.9, and it never reaches 1, but all the values are considered string in the template, and no way to convert string to float.

    So I did this:

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

    If I want to detect some value is beyond 0.8, I must do:

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

    This is a hack, but suffice in my case. I hope it could help others.

    0 讨论(0)
  • 2020-11-27 05:59

    The easiest way to do this is using inbuilt floatformat filter.

    For Integer

    {{ value|floatformat:"0" }}
    

    For float value with 2 precision

    {{ value|floatformat:"2" }}
    

    It will also round to nearest value. for more details, you can check https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#floatformat.

    0 讨论(0)
提交回复
热议问题