FormenCode検証後にクエリストリングパラメーターを使用してパイロンフォームを再定義する

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

質問

私の質問はこれと同じかもしれませんが、提案された答えは助けにはならなかったようです(または、私はそれを正しく理解していませんでした): Pylons 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). 。 ASを定義するだけです newnode(self, id = None) 回ります これ 問題ですが、ロジックでIDが必要であるため、私はそれをすることはできません。

これはとても簡単に思えますが、何が足りないのですか?

役に立ちましたか?

解決

NewNodeでID argを使用している場合、私の好みは、関連するCreatEnode関数で同じARGを使用することです。 IDを使用するために投稿URLを適応させると、現在URLの一部になっているため、parent_idを非表示にする必要はありません。

<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