GOOGLE ADS

jeudi 14 avril 2022

Le modèle Jinja2 évalue la variable en tant qu'attribut

J'ai un modèle Jinja2 sur lequel je travaille pour une application d'édition de base de données, et j'essaie de le rendre "extensible" - plutôt que de coder en dur la page d'édition, je passe une liste d'attributs que je veux dans le table, et en utilisant une boucle for pour les parcourir. Cela fonctionne à part une chose - dans la version codée en dur, j'utilise un attribut d'un objet qui est passé pour voir si cette valeur a été définie (ils sont tous booléens), mais je ne vois pas comment faire en sorte que jinja2 prenne le 'capability' et l'utiliser comme attribut de l'objet 'pupil' ; J'aurais utilisé 'eval' en Python, mais je ne vois pas comment faire fonctionner cela. Voici une idée du code:

{% for capability in capability_list %}
<tr>
<td>{{ capability }}</td>
<td>
{% if pupil.capability %}
<img src="{{request.static_url('gdpr_permissions:static/tick.png')}}" width="25">
{% else %}
<img src="{{request.static_url('gdpr_permissions:static/cross.png')}}" width="25">
{% endif %}
</td>
<td>
<div class="onoffswitch">
<input type="checkbox" name="{{ capability }}" class="onoffswitch-checkbox" value ='No' id="{{ capability }}" checked>
<label class="onoffswitch-label" for="{{ capability }}">
<span class="onoffswitch-inner"></span>
<span class="onoffswitch-switch"></span>
</label>
</div>
</td>
</tr>
{% endfor %}

C'est la {% if pupil.capability %}partie qui ne fonctionne pas - je veux que cela devienne (disons) pupil.web_accesset pupil.database_accessetc., en suivant la liste des capacités qui est itérée.

Des idées sur la façon de faire fonctionner cela avec jinja2, ou comment cela peut-il être approché autrement? L'autre idée que j'avais était d'itérer sur les paramètres actuels dans le backend python, puis de passer une liste de booléens séparément, mais cela semble ajouter un niveau supplémentaire de complexité.


Solution du problème

C'est parce que vous transmettez une chaîne au lieu d'un attribut. Utilisez à la getattr()place. Faites quelque chose commegetattr(pupil, capability)

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...