0

http post リクエストで渡されたパラメータをクラスのフィールドに安全かつ自動的に変換する方法を知っていますか? 私はdjangoを使用していません。webapp2で作業しています

私はこの機能を次のように実装しました。明らかに、これは非常に小さなアプリケーションにとって単純な方法です。より堅実なシステムの提案は大歓迎です。

構築したいフィールドに関する情報を保存する辞書のリストを作成しました

form_fields = [{'placeholder': 'First Name',
           'attribute_name': 'first_name',
           'icon': 'icon-user',
           'has_errors': lambda x: "Name required" if len(x) <= 2 or x == "Name" else None },...]

同じディクショナリに、フォーム テンプレートに必要な追加情報と、入力を検証するために呼び出す関数を保存しました。

post(self): ハンドラーでは、次のようなことをしています:

        errors = []
        my_model = MyModel()
        for field in form_fields:
            value = self.request.get(field['attribute_name'])
            setattr(my_model, field['attribute_name'], value)
            error = field['has_errors'](value)
            if error: errors.append(error)

        if len(errors) == 0:           
            my_model.put()
            self.redirect('/somewhere')
        else:
            template = jinja_environment.get_template('template.html')
            context = {
                'form_fields': form_fields,
                'my_model': my_model,
                'errors': errors
            }
            self.response.write(template.render(context))

ビューは簡単です。

        <ul class="errors">
            {% for error in errors %}
            <li>{{error}}</li>
            {% endfor %}
        </ul>
<form method="post">
<fieldset>
{% for element in form_fields %}
<i class="{{element.icon}}"></i>
<input type="text" name="{{element.attribute_name}}" onfocus="if(this.value == '{{element.placeholder}}') { this.value = ''; }" onblur="if(this.value == '') { this.value = '{{element.placeholder}}'; }" 
       value="{{my_model[element.attribute_name] if my_model is defined else element.placeholder}}" />
{% endfor %}

<div class="clear">
    <button id="submit" type="submit">OK <i class="icon-caret-right buttonArrow"></i></button>
</div>

明らかに、これは非常に小さなアプリケーションにとって単純な方法です。より堅実なシステムの提案は大歓迎です

4

1 に答える 1