2

私の質問はこれと同じかもしれませんが、提案された回答は役に立たなかったようです (または私はそれを正しく理解していませんでした): Pylons FormEncode @validate decorator pass parameters into re-render action

必要なクエリ文字列 (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 が必要なため、それを行うことはできません。

これはとても単純に思えますが、何が欠けているのでしょうか?

4

2 に答える 2

1

newnode で id 引数を使用している場合、関連する createnode 関数で同じ引数を使用することをお勧めします。ID を使用するように投稿 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>
于 2011-01-22T14:54:14.797 に答える
0

検証が失敗した場合、validateデコレータnewnodeは変更されたrequestオブジェクトを使用して呼び出しますが、すべてのGET/POST引数を変更してはなりません

def newnode(self, id=None):
  c.parent_id = id or request.params.get('parent_id')
  return render('newnode.html')
于 2011-01-22T12:15:07.713 に答える