Rerendering eine Pylone Form mit einem Abfragezeichenfolgeflag Parameter nach FormEncode Validierung fehlschlägt
-
13-10-2019 - |
Frage
Meine Frage kann das gleiche wie das, aber die vorgeschlagene Antwort schien nicht zu helfen (oder ich habe es nicht richtig verstanden): Pylone formEncode @validate Dekorateur Pass Parameter in neu rendern Aktion
Ich habe eine einfache Form, die einen erforderliche Abfragezeichenfolgeflag (id) Wert, Nutzungen, dass als verstecktes Formularfeld Wert annimmt, und überprüft die gesendeten Daten. Der Controller sieht wie folgt aus:
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)
und die Form ist sehr einfach:
<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>
Alles funktioniert gut, wenn die Validierung geht, aber wenn es fehlschlägt, newnode
nicht genannt werden kann, weil id
nicht zurück geführt wird. Es wirft TypeError: newnode() takes exactly 2 arguments (1 given)
. Einfach definiert, wie newnode(self, id = None)
wird um das Problem, aber ich kann das nicht tun, wie die ID von der Logik erforderlich ist.
Das scheint so einfach, aber was bin ich dabei?
Lösung
Wenn Sie eine ID arg in Ihrem NewNode meine Präferenz verwenden wäre die gleiche arg zu verwenden. Passen Sie Ihre Post-URL eine ID zu verwenden, und Sie werden nicht die parent_id zu versteckt müssen, weil es jetzt Teil der URL ist.
<form method="post" action="/node/createnode/${request.urlvars['id']}">
<input type="text" name="child_name">
<input name="submit" type="submit" value="Submit">
</form>
Andere Tipps
Wenn die Validierung der validate
Dekorateur Anruf fehlgeschlagen Sie mit modifizierten newnode
Objekt request
, aber alle GET / POST Argumente dürfen nicht geändert werden
def newnode(self, id=None):
c.parent_id = id or request.params.get('parent_id')
return render('newnode.html')