Django ForeignKey 表单字段小部件

Posted

技术标签:

【中文标题】Django ForeignKey 表单字段小部件【英文标题】:Django ForeignKey form field widget 【发布时间】:2015-10-06 00:09:46 【问题描述】:

首先,我试图研究我的问题,但找不到我需要的东西。我的问题可能与我的项目设计有关(任何帮助将不胜感激)。

我面临的问题如下:

我有几个模型 我有一个专门用于创建 ModelForm 的模型 在这个模型中,我有 ForeignKey 字段,默认情况下表示为 ModelForm 中的选择/选项输入小部件(对于每个 value 属性是 ForeignKey,标签之间的文本是 ForeignKey 指向的模型的 __str__() to. 用户看到__str__() 并且提交了option标签的value属性,很棒)。 到目前为止一切顺利,但我想用输入文本字段替换小部件,以便将其实现为搜索字段。 现在,当用户提交表单时,在文本输入字段中输入的字符串被提交,当然 django 不喜欢这样,因为它需要一个外键

我已经可以想出一些解决问题的方法,并且我确信我可以让它发挥作用,但每个人都觉得我会违反一些最佳实践。所以我的问题是我该怎么办?

我是否从 ModelForm 中排除此特定字段并将其实现为输入文本字段,然后在提交表单后使用其值进行查询,然后将 ForeignKey 存储到数据库中 我是否在提交时使用 javascript 操作数据,以便 Django 接收正确的信息 我可以用 Django 清理这些字段数据并将其从字符串转换为 FK 吗? 我是不是走错了路,还是有针对这种情况的 Django 功能?

【问题讨论】:

所以您想要一个链接到您的选择字段选项的搜索功能?或者您是否希望用户能够提交输入框中显示的搜索数据? 创建一个自动完成的 Ajax 搜索字段,用于查询数据库、收集 id 并将其添加到表单值中。 @MatthewR。计划是让用户提交输入框中显示的数据,然后用 Django 更改它,以便可以将其放置在模型中 @petkostas 这听起来是个不错的解决方案,我会尝试一下,谢谢你们的帮助!关于使用 Django 更改数据的初始计划 - 我尝试定义 clean_<fieldname>() 方法并返回外键而不是字符串。它没有用。我发现这个字段根本没有进入cleaned_data。验证过程中的较早步骤可能不是验证它。会是这样吗?如果更改此表单字段类型会起作用吗(因为它是ModelForm,默认表单字段是ModelChoiceField @petkostas 现在我想一想,如果我进行 Ajax 调用并将 id 添加到表单值中,它将改变用户看到的内容(用户应该看到一个字符串,该字符串表示不是来自数据库的 ID) 【参考方案1】:

如果有人有同样的问题,这里是解决方案(至少对我的问题): 我尝试使用clean_<fieldname> 方法将用户输入的字符串更改为数据库ID。该方法没有执行,因为验证过程由于表单字段和小部件之间的差异而提前停止。我将表单字段重新定义为CharField,以便验证步骤正常工作,然后clean_<fieldname> 方法执行没有问题。

【讨论】:

以上是关于Django ForeignKey 表单字段小部件的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin ForeignKey字段小部件选项和不一致的默认值

Django:如何更改内联表单集中的字段小部件

Django使用小部件创建一个只读的表单字段

如何修改 Django 中特定类型的所有内置表单字段的默认小部件?

Django 中的复杂表单小部件

修改django管理字段以使用特定的queryset和表单小部件