确认overwrite/delete? (appengine jinja2 python)
Confirm overwrite/delete? (appengine jinja2 python)
我正在使用 appengine/jinja2 开发一个用于工厂生产计划的应用程序,但我对如何要求用户确认该应用程序是否应覆盖现有数据或删除 NDB 中的实体感到困惑。
也许有人可以提出行动方案?
在 product_edit.py 中,我执行以下操作(简化):
RequestHandler
...
execute query and find given product
template_values = {
'prod_id': query.prod_id,
'prod_desc': query.prod_desc,
}
template = JINJA_ENVIRONMENT.get_template('/html/product_edit.html')
self.response.write(template.render(template_values))
product_edit.html 文件如下所示(我使用的是 w3.css)。
...
<form class="w3-container" action="/products-save" method="post">
<label class="w3-text-blue"><b>Product ID</b></label>
<input value="{{prod_id}}" name="prod_id_txt" size="15" class="w3-input w3-border">
<br>
<label class="w3-text-blue"><b>Product Description</b></label>
<input value="{{prod_desc}}" name="prod_(I'm using w3.css)desc_txt" size="50"
<input class="w3-btn w3-blue" type="submit" value="Save">
</form>
它使用来自 NDB 的产品 ID 和描述填充两个输入,并提供一个 "Save" 按钮。
保存调用适当的请求处理程序来写入导航台。所以我可以覆盖现有的 NDB 实体,没有问题。
但是在覆盖(或删除)现有数据之前如何要求用户确认?
在产品保存请求处理程序中,我当然可以显示一个页面要求用户确认,但在这样做时我丢失了原始数据 POST。
一种选择是通过隐藏字段将数据发送到新的 Jinja2 模板,并在用户确认后保存隐藏字段中的数据。但是,这不会赢得代码美化竞赛,并且容易出现编码错误。我能做些更优雅的事情吗?
对于删除表单,我可以使用弹出窗口来请求确认,但我想使用与编辑相同的方法,以便它们在视觉上相似。
提前致谢!
有很多方法可以做到这一点。最直接的方法是在提交之前通过 javascript 函数连接表单提交。变化:
<input class="w3-btn w3-blue" type="submit" value="Save">
至
<div id="saveWithConfirm">
<input class="w3-btn w3-blue" type="button" value="Save" onclick="confirmOverwrite('ask');" />
</div>
然后:
function confirmOverwrite(confirm) {
confirmDiv = document.getElementById("saveWithConfirm");
if ( confirm == "confirmed" ) {
document.getElementById("ID-of-Form-Here").submit();
} else if ( confirm == "ask" ) {
//... if you need to check the database first, do an ajax call here...
confirmDiv.innerHTML = '<input class="w3-btn w3-blue" type="button" value="No" onclick="confirmOverwrite(\'no\');" /><input class="w3-btn w3-blue" type="button" value="Yes" onclick="confirmOverwrite(\'confirmed\');" /> ';
} else {
confirmDiv.innerHTML = '<input class="w3-btn w3-blue" type="button" value="Save" onclick="confirmOverwrite(\'ask\');" /> ';
}
}
这样,您永远不会离开表格。
我正在使用 appengine/jinja2 开发一个用于工厂生产计划的应用程序,但我对如何要求用户确认该应用程序是否应覆盖现有数据或删除 NDB 中的实体感到困惑。
也许有人可以提出行动方案?
在 product_edit.py 中,我执行以下操作(简化):
RequestHandler
...
execute query and find given product
template_values = {
'prod_id': query.prod_id,
'prod_desc': query.prod_desc,
}
template = JINJA_ENVIRONMENT.get_template('/html/product_edit.html')
self.response.write(template.render(template_values))
product_edit.html 文件如下所示(我使用的是 w3.css)。
...
<form class="w3-container" action="/products-save" method="post">
<label class="w3-text-blue"><b>Product ID</b></label>
<input value="{{prod_id}}" name="prod_id_txt" size="15" class="w3-input w3-border">
<br>
<label class="w3-text-blue"><b>Product Description</b></label>
<input value="{{prod_desc}}" name="prod_(I'm using w3.css)desc_txt" size="50"
<input class="w3-btn w3-blue" type="submit" value="Save">
</form>
它使用来自 NDB 的产品 ID 和描述填充两个输入,并提供一个 "Save" 按钮。 保存调用适当的请求处理程序来写入导航台。所以我可以覆盖现有的 NDB 实体,没有问题。
但是在覆盖(或删除)现有数据之前如何要求用户确认?
在产品保存请求处理程序中,我当然可以显示一个页面要求用户确认,但在这样做时我丢失了原始数据 POST。 一种选择是通过隐藏字段将数据发送到新的 Jinja2 模板,并在用户确认后保存隐藏字段中的数据。但是,这不会赢得代码美化竞赛,并且容易出现编码错误。我能做些更优雅的事情吗?
对于删除表单,我可以使用弹出窗口来请求确认,但我想使用与编辑相同的方法,以便它们在视觉上相似。
提前致谢!
有很多方法可以做到这一点。最直接的方法是在提交之前通过 javascript 函数连接表单提交。变化:
<input class="w3-btn w3-blue" type="submit" value="Save">
至
<div id="saveWithConfirm">
<input class="w3-btn w3-blue" type="button" value="Save" onclick="confirmOverwrite('ask');" />
</div>
然后:
function confirmOverwrite(confirm) {
confirmDiv = document.getElementById("saveWithConfirm");
if ( confirm == "confirmed" ) {
document.getElementById("ID-of-Form-Here").submit();
} else if ( confirm == "ask" ) {
//... if you need to check the database first, do an ajax call here...
confirmDiv.innerHTML = '<input class="w3-btn w3-blue" type="button" value="No" onclick="confirmOverwrite(\'no\');" /><input class="w3-btn w3-blue" type="button" value="Yes" onclick="confirmOverwrite(\'confirmed\');" /> ';
} else {
confirmDiv.innerHTML = '<input class="w3-btn w3-blue" type="button" value="Save" onclick="confirmOverwrite(\'ask\');" /> ';
}
}
这样,您永远不会离开表格。