Перендерирование формы пилонов с помощью параметра запроса QueryString после сбоя проверки Formencode

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

Вопрос

Мой вопрос может быть таким же, как этот, но предложенный ответ, казалось, не помог (или я не понял его правильно): Pylons formencode @validate Decorator Pass Pass Pass в повторное действие

У меня есть простая форма, которая принимает необходимое значение QueryString (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) обойдет это Проблема, но я не могу сделать это, так как идентификатор требуется логикой.

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

Это было полезно?

Решение

Если вы используете ID ARG в своем NewNode, я предпочтение будет использовать тот же ARG в его связанной функции CreateNode. Адаптируйте свой URL -адрес post, чтобы использовать идентификатор, и вам не нужно будет скрыть 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>

Другие советы

Когда проверка не удалась validate Декоратор позвонит вам newnode с модифицированным request объект, но все аргументы получают/публикуются не должны быть изменены

def newnode(self, id=None):
  c.parent_id = id or request.params.get('parent_id')
  return render('newnode.html')
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top