Rerendering una forma Pilones con un parámetro de cadena de consulta después de la validación FormEncode falla
-
13-10-2019 - |
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?
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')