Je veux définir des attributs dynamiquement à un FlaskForm comme celui-ciPython: Impossible de définir dynamiquement des attributs sur un FlaskForm?
form = ModelForm(request.form)
fichier
form.py
class ModelForm(FlaskForm):
def __init__(self, postData):
super(ModelForm, self).__init__()
for p in postData:
setattr(ModelForm, p, StringField(p, validators=[InputRequired()]))
Mais il ne fonctionne que pour la deuxième fois consécutive, la première fois en cours d'exécution, il ne travail. Je ne comprends vraiment pas comment fonctionne le constructeur Python. Comme ce post, il a dit que
class A is not fully initialized when you do your setattr(A, p, v) there.
Mais dans d'autres langues, l'objet doivent être créés après le constructeur fini, et il a des variables pleine de classe, les propriétés déclarées dans le constructeur? Par exemple, cela fonctionne et peut imprimer une touche. Alors, quelle différence y a-t-il dans le constructeur de flacons?
class A(object):
def __init__(self):
self.a = 'i am a accessor'
setattr(self, 'key', 'value')
a = A()
print a.a
print a.key
J'ai mis à jour la question avec un exemple de constructeur pour clarifier la différence. Puisque 'je ne sais pas, comment cela fonctionne en interne en Python' a été dit, cela signifie que le constructeur en Python ne fonctionne pas correctement ou que Flask form a fait quelque chose avec leur bibliothèque pour empêcher l'initialisation de l'objet. Ofcouse, nous pouvons contourner le problème avec 'setattr' en retard, mais cela ne m'aide pas à comprendre ce qui se passe avec Flask ou le constructeur Python – TomSawyer
Que se passe-t-il si vous essayez de mettre l'appel' super() .__ init__' après 'setattr '? Mais pourquoi voulez-vous même utiliser 'setattr' dans' __init__'?Vous essayez de construire un objet qui change ses propres plans pendant les constructions. Je ne sais même pas si cela est supposé fonctionner. – Feodoran
Mettre 'super()' après que setattr ne fonctionne pas, cela donne une erreur 'TypeError: 'NoneType' object is iterable'. Setattr inside __init__ est une bonne pratique et fonctionne dans toutes les langues, il permet d'éviter d'écrire plus de lignes pour déclarer l'objet formulaire, j'ai seulement besoin: 'form = MyForm (attrs)' – TomSawyer