如何创建Django表单,允许用户为“其他”单选选项输入自己的值

时间:2018-07-16 18:32:15

标签: django django-models django-forms

我在Django中有一个名为VolunteerOpportunity的模型,其模型名为event_name。我希望event_name属性是另一个表的外键,应用程序管理员可以在该表中创建默认事件名称,例如Career Fair,Senior Bingo,PAWS等。我也希望有一个“其他”选项,即用户选中该选项后即可输入自己的值。我希望存储该值,但是,我不希望下次加载表单时将其作为选项显示给用户。

我已附上我想要的示例,但这是通过Google表单完成的。

Google Form example

我应该如何构造模型和形式以允许这种结构?

1 个答案:

答案 0 :(得分:0)

即时发现this。请注意,该文章已有四年历史了-但一般原则仍应适用:

创建一个自定义小部件的子类,MultiWidget

此小部件会将无线电选择小部件与MultiWidget.widgets属性中“其他选择”的文本输入小部件结合在一起。您必须实现decompress方法;顾名思义,该方法用于将数据库中存储的单个值转换为多个值,这些值应与self.widgets中定义的小部件相啮合。
我怀疑链接文章中所述的正确呈现窗口小部件的方式是否仍适用于更新的Django版本(例如,forms.RadioSelect.renderer已经不复存在了,所以您将不得不自己动手做些修改。) >

创建一个自定义字段子类,MultiValueField

与上面的自定义窗口小部件一样,此表单字段会将(Model)ChoiceField和“其他选项” CharField合并为一个实体。此自定义字段必须实现compress方法-作为小部件的decompress方法的补充。 compress返回的值用于验证,清理和保存。

制作一个使用自定义字段代替默认表单字段的自定义表单

(不言自明)

配置模型的字段选择或将选择动态分配给表单

如果默认选择的列表是非常静态的,则只需在模型上进行定义即可(如本文中所述)。否则,您可以在form.__init__期间分配表单字段的选择。无论哪种方式,您都应将“其他选项”附加到默认选项列表中。


如果这太麻烦了,您可以考虑使用选择字段的实现,这些实现还允许创建新的记录/选择:django-select2django-autocomplete-light。或者也许已经有这样一个领域了,因为我怀疑您是第一个想要该功能的人。