我对appengine还很陌生,我很想知道在数据验证方面的最佳实践是什么。你知道吗
首先,这是我的型号.py你知道吗
class Event(db.Model):
name = db.StringProperty()
event_type = db.ReferenceProperty(EventType)
data = db.TextProperty()
理想情况下,我希望强制name
和event_type
拥有required=True
。你知道吗
不过,我也来自rails背景,这是我的编辑_事件.html(用于创建和编辑事件):
<form method="POST">
name: <input type="text" name="name" value="{{ event.name or '' }}"/>
<br/>
event type:
<select name="event_type">
{% for event_type in event_types %}
<option value={{ event_type.key().id_or_name() }}>
{{- event_type.name -}}
</option>
{% endfor %}
</select>
<br/>
data: <input type="text" name="data" value="{{ event.data or '' }}"/>
<br/>
<input type="submit" value="Submit"/>
</form>
我的视图函数是这样的:
@app.route('/events/new/', methods=['GET', 'POST'])
@login_required
def new_event():
if request.method == 'GET':
return render_template('edit_event.html',
event=Event(),
event_types=db.Query(EventType).fetch(None))
else:
_update_event(Event(), request.form)
return redirect(url_for('list_events'))
@app.route('/events/<int:event_id>/', methods=['GET', 'POST'])
@login_required
def edit_event(event_id):
event = Event.get_by_id(event_id)
if request.method == 'GET':
return render_template('edit_event.html',
event=event,
event_types=db.Query(EventType).fetch(None))
else:
_update_event(event, request.form)
return redirect(url_for('list_events'))
(注意:为了简洁起见,我省略了\u update \u事件)
如您所见,如果在模型中强制required=True
,new_event()
中的event=Event()
将引发异常。你知道吗
如果我没有在new_event()
中包含event=Event()
,我会得到一个event is not defined
的错误。你知道吗
使required=True和可重用编辑同时存在的好方法是什么_事件.html对new\u事件和edit\u事件都有效?你知道吗
当然,如果我有required=True
和default=X
,那就有点违背目的了。
你有几个选择
您可以为default设置一个sentinal值,如果在调用
put()
或使用_pre_put_hook
执行最终模型验证时设置了默认值,则属性特定的验证器将强制验证失败。你知道吗或者使用一个forms包(Wtforms/deform或任何您正在使用的框架所提供的东西),在其中在forms模式中强制执行这种类型的业务逻辑。你知道吗
通常,您无法在模型中实施/描述模型上的约束,并且需要依赖表单验证阶段来完成这项工作。例如,如果不同属性中的值相互依赖。你知道吗
相关问题 更多 >
编程相关推荐