【问题标题】:Keepvalues=True in web2py when not using SQLFORM不使用 SQLFORM 时在 web2py 中 Keepvalues=True
【发布时间】:2017-04-25 14:50:44
【问题描述】:

当在控制器中使用用 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>

但是如何让字段“模式”显示 ajax 调用(模式)的输出,就像在 html 中一样?

编辑 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>

【问题讨论】:

    标签: python web2py


    【解决方案1】:

    如果您想使用自定义 HTML 构建表单,您仍然可以使用 web2py 生成的 form 对象来帮助填写部分 HTML,如 Custom Forms 文档中所述。

    特别是,您可以通过form.custom.widget[fieldname] 使用web2py 生成的输入小部件。如果您不想要给定字段的整个小部件,您可以通过form.custom.inpval[fieldname] 和form.custom.dspval[fieldname] 仅获取输入和显示值。

    您还可以通过自定义小部件(您可以在模型定义中指定)和 Javascript 的组合使用标准 SQLFORM 生成的表单布局以及级联下拉菜单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多