Rerendering una forma Piloni con un parametro querystring dopo la convalida non riesce FormEncode

StackOverflow https://stackoverflow.com/questions/4742842

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?

È stato utile?

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')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top