Un nouveau rendu sous forme pylônes avec un paramètre de chaîne de requête après validation échoue FormEncode

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

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?

Était-ce utile?

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')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top