我有一个正在更新 SQL 数据库的 Python 应用程序。一种表单(使用 Jinja)提供了一个数据列表输入,其中包含当前值(来自数据库)作为“占位符”
<input list="item_cat" name="item_cat" placeholder="{{item_cat}}"/>
<datalist id="item_cat">
{% for cat_name in categories%}
<option value="{{cat_name}}">
{{cat_name}}
</option>
{%endfor%}
</datalist>
用户可以自由地从数据列表下拉列表中选择可用类别之一,或者输入新的类别此字段中的类别。
当我从列表中选择一个选项,或者当我在数据列表中键入新值时,这将按预期工作。我遇到的问题是,如果我不修改数据列表(并保留“占位符”值),我的 python 代码中的
request.form["item_cat"]
就是空值。显然,占位符没有随表单一起提交。
我期望的是,在表单提交时,如果设置了占位符值,它将由 request.form 返回,并且可以在我的 Python 代码中使用。| ||我可能可以通过使用一些时髦的 JS 来检查
字段的值是否为空,然后主动将其设置为创建表单时的占位符值来解决此问题,但这似乎是一种黑客行为。我并不特别反对 JS(它已经在处理我的表单的客户端验证),但我认为有更好的方法。
item_cat
field is null and then actively set it to whatever the placeholder value was when the form was created, but that seems like a hack. I don't object to JS particularly (it's handling the client-side validation of my forms already) but I assume there's a better way.
你是对的,占位符值不会与表单提交。它们仅仅是为了增强用户体验,而不会被浏览器识别为要提交的数据。
你遇到的问题的核心是,浏览器不会为未更改的输入字段提交数据。由于你正在使用占位符来表示数据库中的当前值,并且用户没有与该字段交互,所以不会有任何数据被发送到你的 Python 代码。
让我们探索一些无需依赖 JavaScript 就能解决这个问题的方法:
1. 隐藏输入字段
一种常见的方法是包含一个隐藏的输入字段,该字段与你的数据列表输入一起保存当前值。这将确保即使用户没有与数据列表交互,值也会被提交。
html
<input type="hidden" name="item_cat" value="{{item_cat}}">
<input list="item_cat" name="item_cat" placeholder="{{item_cat}}">
<datalist id="item_cat">
{% for cat_name in categories%}
<option value="{{cat_name}}">{{cat_name}}</option>
{%endfor%}
</datalist>
在你的 Python 代码中,你可以先检查
request.form['item_cat']
是否具有一个值。如果没有(意味着用户没有选择新的类别),那么你可以使用隐藏输入字段提交的值。
2. 默认值处理(在 Python 中)
另一种方法是在你的 Python 代码中处理默认值。你可以检查
request.form['item_cat']
是否为空。如果是,则使用数据库中的初始值。
python
item_cat = request.form.get('item_cat')
if not item_cat:
item_cat = item_cat_from_database # 从数据库获取初始值
这两种方法都可以有效地解决问题,而无需使用 JavaScript。选择哪种方法取决于你的偏好以及你的应用程序的整体结构。
标签:python,forms,placeholder From: 78781306