Rerendering una forma Pilones con un parámetro de cadena de consulta después de la validación FormEncode falla

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

Pregunta

Mi pregunta puede ser la misma que esto, pero la respuesta sugerida no parecen ayudar (o yo no entiendo correctamente): pilones formEncode pasar parámetros @validate decorador en volver a hacer la acción

Tengo una forma simple que toma un valor cadena de consulta requerido (id), lo usa como un valor de campo de formulario oculto, y valida los datos enviados. Las miradas del controlador como este:

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)

y la forma es muy básico:

<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>

Todo funciona bien si la validación pasa, pero si falla, newnode no puede ser llamado porque id no se pasa de nuevo. Se lanza TypeError: newnode() takes exactly 2 arguments (1 given). Simplemente define como newnode(self, id = None) recibe alrededor de este problema, pero no puedo hacer que a medida que el id es requerido por la lógica.

Esto parece muy sencillo, pero lo que me estoy perdiendo?

¿Fue útil?

Solución

Si está utilizando un arg id en su nodo_nuevo mi preferencia sería el uso de la misma arg en su función CreateNode relacionada. Adaptar su URL después de usar un id, y usted no tiene que oculta la parent_id porque ahora es parte de la URL.

<form method="post" action="/node/createnode/${request.urlvars['id']}">
  <input type="text" name="child_name">
  <input name="submit" type="submit" value="Submit">
</form>

Otros consejos

Cuando la validación falló la llamada validate decorador que newnode con objeto request modificado, pero todos GET / POST debe argumentos no se pueden cambiar

def newnode(self, id=None):
  c.parent_id = id or request.params.get('parent_id')
  return render('newnode.html')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top