不使用 SQLFORM 时,web2py 中的 Keepvalues=True
Keepvalues=True in web2py when not using SQLFORM
当在控制器中使用用 SQLFORM 定义的表单时,可以方便地将 keepvalues
参数设置为 True
,以便在提交表单时存储值并预填充表单。
当表单内置在 html 并且控制器只定义字段中使用的变量时,是否可以轻松实现此结果?
我不能使用 SQLFORM,因为它不允许插入级联下拉菜单。
编辑1: this answer提供了一种解决问题的方法,但我仍然想知道是否有更简单的方法。
在 form.html 中,我在 {{extend 'layout.html'}}
之前添加了 {{response.files.append('https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js')}}
,然后是这个脚本:
<script>
$(function() {
var timeCookie = $.cookie( "timeCookie" ),
selElem = $('select[name=FIELD_NAME]');
selElem.on('change', function() {
$.cookie( "timeCookie", this.value );
});
if( timeCookie != undefined ) {
selElem.val( timeCookie ).change();
} else {
$.cookie( "timeCookie", selElem.val() );
}
});
</script>
使用 FIELD_NAME 指定包含感兴趣值的字段。
编辑 2:这是我所拥有的一个简化示例。
在控制器中:
def form():
types = db().select(db.Types.ALL)
modes = db().select(db.Modes.ALL)
return dict(types = types, modes = modes)
def filter():
modes = db(db.Modes.name == request.vars.type_name).select(db.Modes.ALL)
result = [OPTION(mode.name, _value = mode.id).xml() for mode in modes]
return (result)
def on_submit():
a function that does the insertion in the 2 dbs
在视图中(简体):
{{extend 'layout.html'}}
<form enctype="multipart/form-data" action="{{=URL('default', 'on_submit')}}" method="post">
div class="form-group row">
<label for="type_name" class="col-sm-2 col-sm-form-label">Type</label>
<div class="col-sm-10">
<select name='type_name'
id="type_name"
onchange="ajax('filter', ['type_name'], ':eval');">
{{for type in types:}}
<option value="{{=type.id}}"
{{=" selected='selected'" if str(type.id) == request.vars.type_name else ""}}>
{{=type.name}}
</option>
{{pass}}
</select>
</div>
</div>
<div class="form-group row">
<label for="mode_name" class="col-sm-2 col-sm-form-label">Mode</label>
<div class="col-sm-10">
<select name='mode_name' id="mode_name">
{{=modes}}
</select>
</div>
</div>
</form>
我可以做类似
的事情
def form():
form = SQLFORM.factory(field('type',requires = IS_IN_DB(db, db.Types.id, '%(name)s')),
Field('mode'))
return dict(form =form)
和
{{extend 'layout.html'}}
{{=form.custom.begin}}
Type: <div>{{=form.custom.widget.type}}</div>
Mode: <div>{{=form.custom.widget.mode}}</div>
{{=form.custom.submit}}
{{=form.custom.end}}
我试过了
<script type="text/javascript">
$(document).ready(function(){
$('#no_table_type').change(function() {
ajax('filter', ['no_table_type'], ':eval');
});
});
</script>
但是如何让字段 'mode' 像在 html 中那样显示 ajax 调用(模式)的输出?
编辑 3:
这似乎有效。
{{extend 'layout.html'}}
{{=form.custom.begin}}
Type: <div>{{=form.custom.widget.type}}</div>
Mode: <div>{{=form.custom.widget.mode}}</div>
{{=form.custom.submit}}
{{=form.custom.end}}
<script type="text/javascript">
$(document).ready(function(){
$('#no_table_type').change(function() {
$('#no_table_mode').empty();
ajax('filter', ['type'], 'no_table_mode');
});
});
</script>
如果您想使用自定义 HTML 构建表单,您仍然可以利用 web2py 生成的 form
对象来帮助填写 HTML 的部分内容,如Custom Forms 文档中有描述。
特别是,您可以通过 form.custom.widget[fieldname]
使用 web2py 生成的输入小部件。如果您不想要给定字段的整个小部件,您可以通过 form.custom.inpval[fieldname]
和 form.custom.dspval[fieldname]
.
获取输入和显示值
您可能还可以使用标准 SQLFORM
生成的表单布局以及通过自定义小部件(您可以在模型定义中指定)和 Javascript 的组合的级联下拉菜单。 =16=]
当在控制器中使用用 SQLFORM 定义的表单时,可以方便地将 keepvalues
参数设置为 True
,以便在提交表单时存储值并预填充表单。
当表单内置在 html 并且控制器只定义字段中使用的变量时,是否可以轻松实现此结果?
我不能使用 SQLFORM,因为它不允许插入级联下拉菜单。
编辑1: this answer提供了一种解决问题的方法,但我仍然想知道是否有更简单的方法。
在 form.html 中,我在 {{extend 'layout.html'}}
之前添加了 {{response.files.append('https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js')}}
,然后是这个脚本:
<script>
$(function() {
var timeCookie = $.cookie( "timeCookie" ),
selElem = $('select[name=FIELD_NAME]');
selElem.on('change', function() {
$.cookie( "timeCookie", this.value );
});
if( timeCookie != undefined ) {
selElem.val( timeCookie ).change();
} else {
$.cookie( "timeCookie", selElem.val() );
}
});
</script>
使用 FIELD_NAME 指定包含感兴趣值的字段。
编辑 2:这是我所拥有的一个简化示例。
在控制器中:
def form():
types = db().select(db.Types.ALL)
modes = db().select(db.Modes.ALL)
return dict(types = types, modes = modes)
def filter():
modes = db(db.Modes.name == request.vars.type_name).select(db.Modes.ALL)
result = [OPTION(mode.name, _value = mode.id).xml() for mode in modes]
return (result)
def on_submit():
a function that does the insertion in the 2 dbs
在视图中(简体):
{{extend 'layout.html'}}
<form enctype="multipart/form-data" action="{{=URL('default', 'on_submit')}}" method="post">
div class="form-group row">
<label for="type_name" class="col-sm-2 col-sm-form-label">Type</label>
<div class="col-sm-10">
<select name='type_name'
id="type_name"
onchange="ajax('filter', ['type_name'], ':eval');">
{{for type in types:}}
<option value="{{=type.id}}"
{{=" selected='selected'" if str(type.id) == request.vars.type_name else ""}}>
{{=type.name}}
</option>
{{pass}}
</select>
</div>
</div>
<div class="form-group row">
<label for="mode_name" class="col-sm-2 col-sm-form-label">Mode</label>
<div class="col-sm-10">
<select name='mode_name' id="mode_name">
{{=modes}}
</select>
</div>
</div>
</form>
我可以做类似
的事情def form():
form = SQLFORM.factory(field('type',requires = IS_IN_DB(db, db.Types.id, '%(name)s')),
Field('mode'))
return dict(form =form)
和
{{extend 'layout.html'}}
{{=form.custom.begin}}
Type: <div>{{=form.custom.widget.type}}</div>
Mode: <div>{{=form.custom.widget.mode}}</div>
{{=form.custom.submit}}
{{=form.custom.end}}
我试过了
<script type="text/javascript">
$(document).ready(function(){
$('#no_table_type').change(function() {
ajax('filter', ['no_table_type'], ':eval');
});
});
</script>
但是如何让字段 'mode' 像在 html 中那样显示 ajax 调用(模式)的输出?
编辑 3: 这似乎有效。
{{extend 'layout.html'}}
{{=form.custom.begin}}
Type: <div>{{=form.custom.widget.type}}</div>
Mode: <div>{{=form.custom.widget.mode}}</div>
{{=form.custom.submit}}
{{=form.custom.end}}
<script type="text/javascript">
$(document).ready(function(){
$('#no_table_type').change(function() {
$('#no_table_mode').empty();
ajax('filter', ['type'], 'no_table_mode');
});
});
</script>
如果您想使用自定义 HTML 构建表单,您仍然可以利用 web2py 生成的 form
对象来帮助填写 HTML 的部分内容,如Custom Forms 文档中有描述。
特别是,您可以通过 form.custom.widget[fieldname]
使用 web2py 生成的输入小部件。如果您不想要给定字段的整个小部件,您可以通过 form.custom.inpval[fieldname]
和 form.custom.dspval[fieldname]
.
您可能还可以使用标准 SQLFORM
生成的表单布局以及通过自定义小部件(您可以在模型定义中指定)和 Javascript 的组合的级联下拉菜单。 =16=]