Soustraction de variables dans les modèles de django

Il est capable d’écrire {{ myval.add:5 }} , {{ myval|add:value }} et même {{ myval|add:-5 }} .

Cependant, je ne peux pas trouver ce que je devrais taper pour append la valeur * -1 comme {{ myval|add:-value }} . Cela ne fonctionne pas, malheureusement.

Les balises / filtres de gabarits intégrés à Django ne sont pas exhaustifs, mais il est extrêmement facile d’écrire vos propres balises de gabarit personnalisées: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

Vous pourriez facilement créer votre propre tag de modèle:

 @register.filter def subtract(value, arg): return value - arg 

Vous devez utiliser des guillemets doubles:

 {{ myval|add:"-5" }} 

Cela soustrait cinq de myval .

https://pypi.python.org/pypi/django-mathfilters

install: $ pip install django-mathfilters in template

 {% load mathfilters %} 
  • 8 + 3 = {{ 8|add:3 }}
  • 13 - 17 = {{ 13|sub:17 }}
  • {% with answer=42 %}
  • 42 * 0.5 = {{ answer|mul:0.5 }}
  • {% endwith %} {% with numerator=12 denominator=3 %}
  • 12 / 3 = {{ numerator|div:denominator }}
  • {% endwith %}
  • |-13| = {{ -13|abs }}

J’ai récemment commencé à travailler avec Django et suis également tombé sur celui-ci: j’avais besoin d’une boucle de modèle très simple qui cesse d’imprimer après n fois et affiche un lien “plus” pour basculer le rest des éléments.

Avec un grand intérêt, j’ai lu la lutte des personnes essayant de comprendre pourquoi cela n’était pas ajouté aux filtres par défaut de Django (depuis avant 2013). Je n’ai pas eu envie de créer une balise de modèle personnalisée et j’ai en quelque sorte trouvé un moyen de soustraire 2 variables à l’aide de chaînes et d’ add en combinaison avec with et ssortingngformat

Disons que j’ai une liste d’éléments sur lesquels je veux imprimer les 2 premiers et masquer le rest, en indiquant le nombre d’objects cachés, par exemple.

John, Anna et 5 autres aiment ça (quand on leur donne une liste de 7 articles)

Tant que le nombre d’éléments visibles est codé dans le modèle (par exemple 2), il est possible d’append le négatif 2 |add:"-2" , mais je voulais aussi que le nombre d’éléments visibles soit une variable. La bibliothèque Math-filter suggérée ci-dessus ne semble pas à jour (je ne l’ai pas testée avec Django 2.x).

L’astuce semble être d’utiliser l’ add d’aides pour concaténer les chaînes “-” avec l’entier comme chaîne, afin de pouvoir le ramener à un entier négatif dans tous les appels consécutifs à l’aide auxiliaire. Cela ne fonctionne pas cependant si la valeur n’est pas une chaîne, c’est là que l’aide de ssortingngformat entre en jeu.

Avec valeur de chaîne

template posts.html (notez comment est explicitement transmis comme chaîne – alternative ci-dessous)

 {% for post in posts %} 

{{ post.title }}

... {% include 'show_likes.html' with likes=post.likes visible="3" %} {% endfor %}

template show_likes.html (notez l’ add:0 pour que l’opérateur booléen fonctionne)

 {% with show=visible|default:"2" %} {% for like in likes %} {% if forloop.counter <= show|add:0 %} {% if not forloop.first %},{% endif %} {{ like.username }} {% endif %} {% endfor %} {% if likes|length > show|add:0 %} {% with rest="-"|add:show %} and {{ likes|length|add:rest }} more {% endwith %} {% endif %} like this {% endwith %} 

Alternative avec entier

Vous pouvez simplement convertir votre entier en une chaîne dans le modèle d’appel en utilisant |ssortingngformat:"d"

Si toutefois le nombre d’éléments visibles à afficher est un nombre entier, vous devrez append un appel à ssortingngformat: “d” pour le convertir en chaîne

template posts.html

 {% for post in posts %} 

{{ post.title }}

... {% include 'show_likes.html' with likes=post.likes visible=3 %} {% endfor %}

template show_likes.html

 {% with show=visible|default:2 %} {% with show_str=show|ssortingngformat:"d" %} {% for like in likes %} {% if forloop.counter <= show %} {% if not forloop.first %},{% endif %} {{ like.username }} {% endif %} {% endfor %} {% if likes|length > show|add:0 %} {% with rest="-"|add:show_str %} and {{ likes|length|add:rest }} more {% endwith %} {% endif %} {% endwith %} {% endwith %} 

Étant donné que je suis très débutant avec Django et Python, je suis sûr que cette approche est bien pire que de créer un assistant personnalisé! Donc, je ne suggère pas que quiconque devrait l’utiliser. Ce n’était que ma tentative d’essayer de résoudre ce problème avec les outils d’aide disponibles et sans aucun élément personnalisé.

J’espère que cela t’aides