gpt4 book ai didi

python - Django:禁用的下拉列表不会将信息发送回 POST

转载 作者:太空狗 更新时间:2023-10-29 17:42:52 25 4
gpt4 key购买 nike

我在模型表单中有一个下拉列表,用户不应该能够更改选定的值。我发现 disabled 确实可以满足我的需要。然而,这有一个奇怪的地方:

当表单第一次打开 (GET) 时,值被选中,用户无法更改该值。这是伟大的:

enter image description here

但是一旦不相关字段出现验证错误并且POST将用户发送回相同的表单,之前的信息就会丢失。禁用的外键下拉列表不再包含任何值并且非常烦人。

enter image description here

我做了一些研究,在 stackoverflow 上发现了一些东西,当外键下拉小部件被禁用时,似乎根本没有数据被发回。虽然可以覆盖验证以不为下拉字段抛出任何错误,如 third answer here解释。但是,如果任何其他不相关的字段抛出错误,则数据将丢失,因为禁用的下拉列表从未首先将任何数据发送到 POST。

这是一个棘手的情况。

有没有办法将 View 中的数据传递给 request.POST ?或者你有什么建议?我可以使用 readonly 而不是 disabled 并且这会起作用,但是下拉列表可以由用户更改,这也很烦人。

有什么想法吗?非常感谢

编辑:

小更正:数据没有完全丢失。相反,选择被错误地设置为初始虚拟值。

    <select id="id_form-0-deal_type" name="form-0-deal_type" disabled="disabled">
<option selected="selected" value="">---------</option>
<option value="1">deal 1</option>
<option value="2">deal 2</option>
</select>

更新:

Francis 的解决方案看起来很有前途。所以我尝试了他的第二个建议,并在 html 中添加了一个隐藏的输入字段,并将正确的值传递到 POST。

现在的问题是如何进行。我试过像这样在表单集的表单查询字典中添加缺少的条目(以便设置正确的下拉值)

formset.forms[0].data['form-0-deal_type'] = formset.forms[0].data['form-0-hiddenfield'] 

但是它说 This QueryDict instance is immutable

唯一的其他方法是通过 Initials 设置它与常规表格集。不幸的是,我正在使用 modelformsets,它 doesn't support initials对于现有表格。

如果没有其他解决方案,我开始将我的 modelformset 重构为常规 formset。仍然对想法持开放态度...

最终更新+解决方案:

无需将 modelformset 重构为常规 fomset。事实上,我非常不鼓励这样做,因为它本身会带来其他问题。 modelformsets 为您处理一切并填补缺失的部分。

实际问题是 QueryDict 是不可变的,但这可以通过复制它们轻松解决:

formset = deal_formset(request.POST, queryset=formset_query)        
if formset.is_valid():
pass
else:
new_post = request.POST.copy()
deal_types = dict()
for k,v in new_post.items():
if k.startswith('hidden'):
deal_types[k[7:]]= v
for k,v in deal_types.iteritems():
new_post[k] = v
formset = deal_formset(new_post, queryset=formset_query)

这加上弗朗西斯的解决方案:

{{ formset.management_form }}
{% for fs in formset %}
{{ fs.id }}
<input type="hidden" name="hidden-{{ fs.prefix }}-deal_type" value="{{fs.deal_type.value}}" />
{{fs.deal_type}}
{% endfor %}
{% endif %}

创造奇迹...享受 :)

最佳答案

它不是 django 的东西,它是 HTML 的东西。禁用的表单元素不会由表单发送。

[The Element] cannot receive user input nor will its value be submitted with the form.

http://www.w3.org/TR/html401/interact/forms.html#h-17.12.1 & http://www.w3schools.com/tags/att_input_disabled.asp

如果它在文本/文本区域上,你可以使用 readonly http://www.w3schools.com/tags/att_input_readonly.asp

您可以做的其他事情是显示明文值,并将其作为隐藏字段提交....

{{ form.field_name.label_tag }}
{{ form.field_name.value }}
<input type="hidden" name="field_name" value="{{form.field_name.value}}" />

它不是很优雅,但它可以让你到达那里。

您还可以更进一步,编写一些 JS 来查找禁用的元素,并在之后添加带有该元素名称和值的输入。

一些示例 JQuery:

//Untested, but you get the gist
$(':disabled').each(
function()
{
$(this).after('<input type="hidden" name="' + $(this).attr('name') + '" value="' + $(this).val() + '" />');
}
);

关于python - Django:禁用的下拉列表不会将信息发送回 POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11748971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com