Un nouveau rendu sous forme pylônes avec un paramètre de chaîne de requête après validation échoue FormEncode
-
13-10-2019 - |
Question
Ma question peut être la même chose que cela, mais la réponse proposée ne semble pas aider (ou je ne comprenais pas correctement): pylônes FormEncode paramètres passe-décorateur @validate en re-rendre l'action
J'ai une forme simple qui prend une valeur querystring nécessaire (id), utilise comme une valeur de champ de formulaire caché, et valide les données affichées. Le contrôleur se présente comme suit:
class NewNodeForm(formencode.Schema):
parent_id = formencode.validators.Int(not_empty = True)
child_name = formencode.validators.String(not_empty = True)
def newnode(self, id):
c.parent_id = id
return render('newnode.html')
@validate(schema=NewNodeForm(), form='newnode')
def createnode(self):
parentId = self.form_result.get('parent_id')
childName = self.form_result.get('child_name')
nodeId = save_the_data(parentId, childName)
return redirect_to(controller = 'node', action = 'view', id = nodeId)
et la forme est très simple:
<form method="post" action="/node/createnode">
<input type="text" name="child_name">
<input type="hidden" value="${c.parent_id}" name="parent_id">
<input name="submit" type="submit" value="Submit">
</form>
Tout fonctionne très bien si la validation passe, mais si elle échoue, newnode
ne peut pas être appelé parce que id
n'est pas repassée. Il jette TypeError: newnode() takes exactly 2 arguments (1 given)
. Il suffit de définir comme newnode(self, id = None)
se déplace ce problème, mais je ne peux pas le faire comme l'ID est requis par la logique.
Cela semble si simple, mais qu'est-ce que je manque?
La solution
Si vous utilisez un arg identifiant dans votre newnode ma préférence serait d'utiliser la même arg dans la fonction CreateNode connexe est tout. Adaptez votre url poste à utiliser un identifiant, et vous ne serez besoin caché parent_id parce qu'il fait maintenant partie de l'URL.
<form method="post" action="/node/createnode/${request.urlvars['id']}">
<input type="text" name="child_name">
<input name="submit" type="submit" value="Submit">
</form>
Autres conseils
Lorsque la validation a échoué à l'appel décorateur validate
vous newnode
avec objet request
modifié, mais tous GET / POST arguments doivent être pas modifiés
def newnode(self, id=None):
c.parent_id = id or request.params.get('parent_id')
return render('newnode.html')