Rerendering eine Pylone Form mit einem Abfragezeichenfolgeflag Parameter nach FormEncode Validierung fehlschlägt

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

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?

War es hilfreich?

Lösung

in seinem verwandten CreateNode Funktion

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')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top