Rerendering una forma Piloni con un parametro querystring dopo la convalida non riesce FormEncode
-
13-10-2019 - |
Domanda
La mia domanda può essere lo stesso di questo, ma la risposta suggerita non sembrano aiuto (o non ho capito correttamente): piloni FormEncode parametri passa @validate decoratore in ri-rendering
Ho una forma semplice che prende un valore querystring richiesto (id), usi che come un valore di campo di modulo nascosto, e convalida i dati pubblicati. Gli sguardi del controller come questo:
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)
e la forma è molto semplice:
<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>
Tutto funziona bene se la convalida passa, ma se fallisce, newnode
non può essere chiamato perché id
non viene passato indietro. Si getta TypeError: newnode() takes exactly 2 arguments (1 given)
. Basta definire come newnode(self, id = None)
ottiene intorno questo problema, ma non posso farlo come ID è richiesto dalla logica.
Questo sembra così semplice, ma quello che mi manca?
Soluzione
Se si utilizza un arg id nel vostro newnode la mia preferenza sarebbe quella di utilizzare lo stesso arg in essa la funzione di CreateNode correlato. Adattare il vostro URL post per utilizzare un ID, e voi non dovete nascosto il parent_id perché è ormai parte dell'URL.
<form method="post" action="/node/createnode/${request.urlvars['id']}">
<input type="text" name="child_name">
<input name="submit" type="submit" value="Submit">
</form>
Altri suggerimenti
Quando la convalida non è riuscita la chiamata validate
decoratore si newnode
con oggetto request
modificata, ma tutti GET / POST argomenti non devono essere modificati
def newnode(self, id=None):
c.parent_id = id or request.params.get('parent_id')
return render('newnode.html')