Domanda

Mi sto solo familiarizzando con pallone, wtforms (e pallone-wtf).Mi sento come se mi manchi qualcosa.

Secondo il WTForms Docs "può essere il tuo campo modulo HTMLGenerato per te, ma ti permettono di personalizzarlo nei tuoi modelli. Ciò consente di mantenere la separazione del codice e la presentazione e mantenere i parametri disordinati dal tuo codice Python. "

Il metodo suggerito di modellazione degli ingressi radio HTML è:

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

.... e il modo suggerito per il modello di ingressi radio HTML è:

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

Con questo approccio, non è la proprietà delle scelte "che è una sequenza di (valore, etichetta) coppie" che mescola la presentazione con i modelli?

è un modo per spostare l'etichetta sul modello e abbinarlo con il valore?

È stato utile?

Soluzione

Domanda interessante. Se pensiamo in termini di modello MVC, penso che l'elenco delle scelte che vada in un ascensore appartenga al modello, non nella vista. Quindi non avrei queste scelte definite dal designer in un modello. Credo che siamo d'accordo su questo, giusto?

Avere l'elenco delle scelte hardcoded nel modulo come nel tuo esempio è migliore, ma non è anche l'ideale. Presumibilmente hai un modello Language o un'entità simile, corretta? Quel modello è l'autorità sulle scelte di linguaggio di programmazione valide, quindi dovrebbe essere quella che fornisce l'elenco delle scelte valide a chiunque, sia una forma o un altro sottosistema.

Come menzione nella tua domanda, ogni scelta ha un nome interno e un nome visualizzato. E dal momento che stiamo parlando di stringhe di visualizzazione, non dimentichiamo che il titolo u'Programming Language' per il tuo campo cade nella stessa categoria di stringhe di visualizzazione. Queste stringhe dovrebbero essere responsabilità del progettista del modello? Non lo so, questa è un'area grigia tra modello e presentazione, penso che il designer dovrebbe avere autorità su come le cose guardano, ma non sul contenuto.

Se volevi avere più controllo su come queste stringhe di visualizzazione sembrano utilizzare un toolkit di traduzione come GetText (tramite Flask-Babel, ad esempio). Se la tua applicazione rende il testo tramite GetText è possibile mappare qualsiasi stringhe dal codice o il modello in altre stringhe. Questo è usato per tradurre in altre lingue, ma è anche possibile usarlo per avere un controllo separato su come le stringhe vengono visualizzate nella lingua madre dell'applicazione. La mappatura viene eseguita in un file di dati esterno, quindi penso che questo raggiunga l'indipendenza che stai cercando.

Altri suggerimenti

Dal punto di vista puramente teorico che non sembra essere una buona idea.Se dovessi collegare l'etichetta con valore effettivo nel modello, questo significherebbe avere una logica aziendale nel modello.

Inoltre, come avresti immaginato il codice esatto a farlo?Richiederebbe il contesto del sottocampo all'interno della dichiarazione che assegna l'etichetta.Non riesco a immaginare quel codice che sembra buono nel modello.E farebbe parte della logica di presentazione come dovrebbe?

Ecco la soluzione con cui ho trovato (per mantenere la separazione).Potrebbe essere eccessivo, ma ci proverò e vedrò come scale.

in forbs.py:

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

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

Quindi ho creato un file nella cartella Modelli chiamato Constant.py:

from wtforms.validators import InputRequired

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

Spero che aiuti (e funziona)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top