Question

Je suis juste en train de me familiariser avec Flask, WTForms (et flask-WTF).J'ai l'impression qu'il me manque quelque chose.

Selon le Documents WTForms "Le HTML de votre champ de formulaire peut être généré pour vous, mais nous vous laissons le personnaliser dans vos modèles.Cela vous permet de maintenir la séparation du code et de la présentation, et de garder ces paramètres désordonnés hors de votre code Python. »

La méthode suggérée pour modéliser les entrées radio HTML est la suivante :

class ExmapleForm(Form):
    language = RadioField(u'Programming Language', choices=[('py', 'Python'), ('js', 'JavaScript')])

....et la manière suggérée de modéliser les entrées radio HTML est la suivante :

{% for subfield in form.radio %}
    <tr>
        <td>{{ subfield }}</td>
        <td>{{ subfield.label }}</td>
    </tr>
{% endfor %}

Avec cette approche, la propriété choix n'est-elle pas « qui est une séquence de paires (valeur, étiquette) » mélangeant la présentation avec les modèles ?

Existe-t-il un moyen de déplacer l'étiquette vers le modèle et de la faire correspondre à la valeur ?

Était-ce utile?

La solution

Question interessante.Si nous pensons en termes de modèle MVC, je pense que la liste de choix figurant dans une liste déroulante appartient au modèle, pas à la vue.Je ne voudrais donc pas que ces choix soient définis par le concepteur dans le modèle.Je crois que nous sommes d'accord là-dessus, non ?

Il est préférable d'avoir la liste de choix codée en dur sous la forme comme dans votre exemple, mais ce n'est pas non plus idéal.Vraisemblablement, vous avez un Language modèle ou entité similaire, n'est-ce pas ?Ce modèle fait autorité en matière de choix valides de langage de programmation. Il devrait donc être celui qui fournit la liste des choix valides à quiconque, qu'il s'agisse d'un formulaire ou d'un autre sous-système.

Comme vous le mentionnez dans votre question, chaque choix a un nom interne et un nom d'affichage.Et puisque nous parlons de chaînes d'affichage, n'oublions pas que le u'Programming Language' le titre de votre champ appartient à la même catégorie de chaînes d'affichage.Ces chaînes devraient-elles relever de la responsabilité du concepteur du modèle ?Je ne sais pas, c'est une zone grise entre le modèle et la présentation, je pense que le designer devrait avoir autorité sur l'apparence des choses, mais pas sur le contenu.

Si vous souhaitez avoir plus de contrôle sur l'apparence de ces chaînes d'affichage, vous pouvez utiliser une boîte à outils de traduction telle que gettext (via Flask-Babel, par exemple).Si votre application restitue le texte via gettext, vous pouvez mapper n'importe quelle chaîne du code ou du modèle vers d'autres chaînes.Ceci est utilisé pour traduire dans d'autres langues, mais vous pouvez également l'utiliser pour contrôler séparément la façon dont les chaînes s'affichent dans la langue native de l'application.Le mappage est effectué dans un fichier de données externe, je pense donc que cela permet d'obtenir l'indépendance que vous recherchez.

Autres conseils

du point de vue purement théorique qui ne semble pas être une bonne idée.Si vous deviez connecter l'étiquette avec une valeur réelle dans le modèle, cela signifierait avoir une logique commerciale dans le modèle.

En outre, comment envisageriez-vous le code exact de cela?Cela nécessiterait un contexte de sous-champ dans l'instruction attribuant l'étiquette.Je ne peux pas imaginer que ce code a l'air bien dans le gabarit.Et serait-il faisant partie de la logique de présentation comme il se doit?

Voici la solution que j'ai proposée (pour maintenir la séparation).Cela peut être surchargé, mais je vais essayer de l'essayer et voir comment ça échoue.

in formulaires.py:

import sys
sys.path.append("templates")
import constants

class ExmapleForm(Form):
    language = RadioField('language', choices=constants.languages['choices'], validators=constants.languages['validators'])

Puis j'ai créé un fichier dans le dossier Modèles appelé constantes.py:

from wtforms.validators import InputRequired

languages = {
    'choices': [
        ('py', 'Python'),
        ('js', 'JavaScript')
    ],
    'validators': [
        InputRequired(message = 'Please Select')
    ]
}

espère que cela aide (et fonctionne)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top