web-dev-qa-db-fra.com

Besoin de convertir une chaîne en int dans un modèle Django


J'essaie de transmettre les paramètres d'URL à un modèle Django comme celui-ci ...

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

C'est la ligne d'appel de mon fichier views.py. persistConTemplate.html est le nom de mon modèle et request.GET est le dictionnaire qui contient les paramètres d'URL.

Dans le modèle, j'essaie d'utiliser l'un des paramètres tels que celui-ci ...

{% for item in (numItems) %}

  item {{item}}

{% endfor %}

numItems est l'un des paramètres url que j'envoie dans ma requête comme ceci ...

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

Lorsque j'essaie la boucle for ci-dessus, j'obtiens une sortie comme celle-ci ....

image 1 image 2

J'attends et aimerais voir l'image Word imprimée 12 fois ...

image 1 image 2 image 3 image 4 image 5 image 6 image 7 image 8 image 9 image 9 image 10 image 11 image 12

Quelqu'un peut-il s'il vous plaît me dire ce que je vais mal?

39
user479808

Oui, la place pour cela est dans la vue.

Je pense que l'exemple ci-dessus ne fonctionnera pas - vous ne pouvez pas parcourir un nombre entier.

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

vous pouvez contraindre une str à un int en utilisant le filtre d'ajout 

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

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

contraindre int à str juste utiliser slugify

{{ some_int|slugify }}

EDIT: Cela dit, je suis d’accord avec les autres pour dire que vous devriez normalement procéder de la sorte - utilisez ces astuces uniquement lorsque les alternatives sont bien pires.

105
scytale

J'aime créer un filtre personnalisé:

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

C'est pour les cas où cela ne peut pas être facilement fait en vue.

20
clime

Vous devez ajouter du code à votre vue pour décompresser les paramètres GET et les convertir en valeurs souhaitées. Même si numItems était un entier, la syntaxe que vous montrez ne vous donnerait pas le résultat souhaité.

Essaye ça:

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

Ma solution est un peu un bidouillage et très spécifique ..

Dans le modèle, je souhaite comparer un pourcentage avec 0,9 et il n'atteint jamais 1, mais toutes les valeurs sont considérées comme une chaîne dans le modèle et aucun moyen de convertir une chaîne en float.

Alors j'ai fait ça:

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

Si je veux détecter une valeur supérieure à 0,8, je dois faire:

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

C'est un bidouillage, mais cela suffit dans mon cas. J'espère que cela pourrait aider les autres.

0
WesternGun

La méthode la plus simple consiste à utiliser le filtre intégré floatformat.

Pour Integer

{{ value|floatformat:"0" }}

Pour valeur float avec 2 précision 

{{ value|floatformat:"2" }}

Il sera également arrondi à la valeur la plus proche. pour plus de détails, vous pouvez vérifier https://docs.djangoproject.com/fr/1.10/ref/templates/builtins/#floatformat .

0
Akash