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): handler 我正在做这样的事情:

        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

0

也许内置函数setattr可以帮助你:

class X(object):
    pass

x = X()
setattr(x, 'a', 2)
print x.a  # returns 2

setattr的文档。

于 2013-04-19T17:18:30.837 回答