Повторная визуализация формы Pylons с параметром querystring после сбоя проверки FormEncode - PullRequest
2 голосов
/ 20 января 2011

Мой вопрос может быть таким же, как этот, но предложенный ответ, похоже, не помог (или я не понял его правильно): Пилоны FormEncode @validate передают параметры в действие повторной визуализации

У меня есть простая форма, которая принимает требуемое значение строки запроса (id), использует ее в качестве скрытого значения поля формы и проверяет опубликованные данные.Контроллер выглядит так:

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)

и форма очень проста:

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

Все работает нормально, если проверка прошла успешно, но если она не пройдена, newnode не можетбыть вызванным, потому что id не передается обратно.Это бросает TypeError: newnode() takes exactly 2 arguments (1 given).Простое определение как newnode(self, id = None) обходит эту проблему, но я не могу этого сделать, поскольку логика требует идентификатор.

Это кажется таким простым, но чего я упускаю?

Ответы [ 2 ]

1 голос
/ 22 января 2011

Если вы используете идентификатор arg в своем новом узле, я бы предпочел использовать тот же самый аргумент в связанной с ним функции createnode.Адаптируйте ваш пост-URL для использования идентификатора, и вам не нужно будет скрывать parent_id, потому что он теперь является частью URL-адреса.

<form method="post" action="/node/createnode/${request.urlvars['id']}">
  <input type="text" name="child_name">
  <input name="submit" type="submit" value="Submit">
</form>
0 голосов
/ 22 января 2011

При сбое проверки декоратор validate вызывает вас newnode с измененным request объектом, но все аргументы GET / POST не должны быть изменены

def newnode(self, id=None):
  c.parent_id = id or request.params.get('parent_id')
  return render('newnode.html')
...