你知道有什么方法可以安全、自动地将在 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>
显然,对于一个非常小的应用程序来说,这是一种幼稚的方式。对更坚实的系统的建议将不胜感激