組み込みのフォーム メカニズムを使用しているようには見えません。興味があります。データをクリーンアップするには、どのように正確に行う必要がありますか?
通常、フォームを構築する関数と、それを処理するためのブランチを持つコントローラー ファイルを作成します。データ モデルでは、受け入れ可能な入力を指定し、フォーム処理関数 (コントローラー関数) でデータを操作します。
使用することもできます
form.process(..., onvalidation=some_func)
onvalidation は、フォームをさらに処理し、DB に格納する前に値を作成/操作し (または DB にまったく格納できない)、さらに検証を行うことができる関数です。
参照: http://web2py.com/books/default/chapter/29/7#onvalidation
Web2py フォームは通常、自己送信し、二重送信などを防ぐためにセッション キーが設定されています。セッションなしで form.accepts(...) を使用するか、web2py form.accepts/form.process をスキップして request.vars.field_name_that_you_provided を使用してフォーム フィールド データを取得する必要があります。 . 次に、データを自分で検証する必要があります。
web2py モデル (models/form.py) を作成するか、少なくとも、フォームの表示と処理を担当するコントローラー ファイル内で web2py の FORM ヘルパーを使用してフォームを作成することをお勧めします。
これが web2py のやり方です。入力するフォームを返すか、フォームを処理する単一の関数です。すべてがグルーヴィーな場合は、リダイレクトを使用して別のページに送信できます。
def display_form():
form = FORM('Your name:',
INPUT(_name='name', requires=IS_NOT_EMPTY()),
INPUT(_type='submit'))
if form.process().accepted:
session.flash = 'form accepted'
redirect(URL('next'))
elif form.errors:
response.flash = 'form has errors'
else:
response.flash = 'please fill the form'
return dict(form=form)
別の方法はこれです:
def process_form():
validated_data = dict()
for k,v in request.vars.values(): # I think this works...
if k == 'some_key':
do_some_processing()
...
validated_data[k] = some_func(v)
...
# now everyhing is validated and ok, send the data on
redirect('next_page', vars=validated_data)
リダイレクトは、検証済みのフォーム データを次の関数に送信します。それをweb2py関数に送信する必要がない場合は、必要な関数をprocess_form関数から実行してください。
わかる?
編集: 別の言い方をすれば、スクリプトの内容はフォーム処理関数で実行する必要があるということです。同じコントローラ ファイル内の別の関数によって明示的に実行されるコントローラ関数を定義できます。ビューが関連付けられておらず、スタンドアロンのページではなく、単なる機能です。
execfile("path/to/file") を使用することもできます。スクリプトを applications//private/ に配置し、 request.folder を使用してアプリが存在するフォルダーを取得してから、プライベートに追加することをお勧めします...次のようなものです:
execfile(os.path.join(request.folder, 'private', 'script.py'))
ただし、それが適切なパスを取得することを確認する必要があります。
編集 (フォームの検証): データ モデルの作成方法とフォーム/バリデーターの使用方法に関する web2py の書籍を参照してください ( http://web2py.com/books/default/chapter/29/7 )。web2pyデータモデルを定義するとき、バリデーターをフィールド定義に直接含めることができます。このようにして、データベースはそれが整数か文字列かを認識し、入力に長さまたは正規表現パターンを強制できます。利点は、作成するフォームが次のとおりであることです。
form = SQLFORM(db.some_table)
または: form = SQLFORM.factory(Field('some_field', 'integer'), Field('some_str', 'string', requires=IS_ALPHANUMERIC))
検証は非常に簡単です。整数型のフィールドは、入力された数値以外の値をすぐに削除します。ソース コードを変更したり、不適切な値で POST/GET リクエストを送信したりしても、form.process(...) メソッドはそれを無効にして、エラーを簡単に強調表示できるようにします。
フォーム定義の例を次に示します。
db.define_table('news_item',
Field('title', 'string', label='Title', requires=IS_NOT_EMPTY()),
Field('type', 'string', label='Type', requires=IS_IN_SET(news_types)),
Field('pub_date', 'date', default=request.now),
Field('post_date', 'date', default=request.now), # Set date defaults
Field('link', 'string', label='News Link', requires=IS_EMPTY_OR(IS_URL())),
Field('img', 'upload', uploadfield='img_file', label='Story Title Image'),
Field('img_file', 'blob', label='Story Title Image'),
Field('tagline', 'text', label='Tagline', requires=IS_NOT_EMPTY()),
Field('published', 'boolean', label='Published?', notnull=True, required=True),
)
これにより、プログラムで以前に定義されたデータベース (db = DAL("...connection string") ) に news_item というテーブルが作成され、すぐに見栄えの良いフォームを作成できます。多くのオプション パラメータがあることに注意してください。
DB をスキップしてフォームを直接作成することもできますが、それについてはドキュメントで調べてみましょう :)