Je veux concaténer une chaîne dans une balise de modèle Django, comme:
{% extend shop/shop_name/base.html %}
Ici shop_name
ma variable et je veux concaténer cela avec le reste du chemin.
Supposons que j'aie shop_name=example.com
et que je veuille que le résultat s'étende shop/example.com/base.html
.
django
django-templates
Ahsan
la source
la source
shop_name
du tout, donc c'est dangereux.shop_name
avant de le transmettre au contexte d'une vue,get_context_data
assurez-vous qu'il est traduit en utilisantugettext
au lieu deugettext_lazy
.Ne pas utiliser
add
pour les chaînes, vous devez définir une balise personnalisée comme celle-ci:Créez un fichier:
<appname>\templatetags\<appname>_extras.py
puis utilisez-le comme @Steven dit
Raison pour éviter
add
:Selon la documentation
Si les deux variables sont des entiers, le résultat serait inattendu.
la source
add
" seul n'utilise tout simplement passtr()
en premier lieu et ne fonctionne pas du tout pour moi alors que votre solution fonctionne parfaitement{% load <appname>_extras %}
J'ai changé la hiérarchie des dossiers
et puis ci-dessous fonctionnerait.
Maintenant, il est capable d'étendre la page base.html.
la source
Reportez-vous à Concaténation de chaînes dans les modèles Django :
Pour les versions antérieures de Django:
{{ "Mary had a little"|stringformat:"s lamb." }}
Autre:
{{ "Mary had a little"|add:" lamb." }}
la source
Jetez un œil au
add
filtre .Modifier: vous pouvez enchaîner les filtres, vous pouvez donc le faire
"shop/"|add:shop_name|add:"/base.html"
. Mais cela ne fonctionnera pas car il appartient à la balise de modèle d'évaluer les filtres dans les arguments, et ne le fait pas.Je suppose que vous ne pouvez pas faire cela dans les modèles.
la source
À partir de la documentation:
Cette balise peut être utilisée de deux manières:
{% extends "base.html" %}
(avec guillemets) utilise la valeur littérale "base.html" comme nom du modèle parent à étendre.{% extends variable %}
utilise la valeur de variable. Si la variable correspond à une chaîne, Django utilisera cette chaîne comme nom du modèle parent. Si la variable évalue un objet Template, Django utilisera cet objet comme modèle parent.Il semble donc que vous ne pouvez pas utiliser de filtre pour manipuler l'argument. Dans la vue appelante, vous devez soit instancier le modèle ancêtre, soit créer une variable de chaîne avec le chemin correct et la transmettre avec le contexte.
la source
La réponse de @ error est fondamentalement juste, vous devriez utiliser une balise de modèle pour cela. Cependant, je préfère une balise de modèle légèrement plus générique que je peux utiliser pour effectuer tout type d'opérations similaires à celle-ci:
et ensuite vous pouvez l'utiliser comme ceci dans votre modèle:
Comme le commentaire le mentionne, cette balise de modèle est particulièrement utile pour les informations qui sont répétables dans tout un modèle mais qui nécessitent une logique et d'autres éléments qui accrocheront vos modèles, ou dans les cas où vous souhaitez réutiliser les données passées entre les modèles via des blocs:
puis:
Le crédit pour le tag captureas est dû ici: https://www.djangosnippets.org/snippets/545/
la source
J'ai trouvé que travailler avec l'
{% with %}
étiquette était assez compliqué. Au lieu de cela, j'ai créé la balise de modèle suivante, qui devrait fonctionner sur des chaînes et des entiers.Ensuite, chargez la balise de modèle dans votre modèle en haut en utilisant ce qui suit:
Vous pouvez ensuite l'utiliser de la manière suivante:
J'ai personnellement trouvé que c'était beaucoup plus propre à travailler.
la source
Vous ne pouvez pas faire de manipulation de variables dans les modèles django. Vous avez deux options, soit écrire votre propre tag de modèle, soit le faire en vue,
la source
extends
n'a aucune facilité pour cela. Placez le chemin du modèle entier dans une variable de contexte et utilisez-la, ou copiez la balise de modèle exist et modifiez-la de manière appropriée.la source
Et concaténation multiple:
Et dans le modèle:
la source