我在Django中有一个名为VolunteerOpportunity
的模型,其模型名为event_name
。我希望event_name
属性是另一个表的外键,应用程序管理员可以在该表中创建默认事件名称,例如Career Fair,Senior Bingo,PAWS等。我也希望有一个“其他”选项,即用户选中该选项后即可输入自己的值。我希望存储该值,但是,我不希望下次加载表单时将其作为选项显示给用户。
我已附上我想要的示例,但这是通过Google表单完成的。
我应该如何构造模型和形式以允许这种结构?
答案 0 :(得分:0)
即时发现this。请注意,该文章已有四年历史了-但一般原则仍应适用:
此小部件会将无线电选择小部件与MultiWidget.widgets
属性中“其他选择”的文本输入小部件结合在一起。您必须实现decompress
方法;顾名思义,该方法用于将数据库中存储的单个值转换为多个值,这些值应与self.widgets
中定义的小部件相啮合。
我怀疑链接文章中所述的正确呈现窗口小部件的方式是否仍适用于更新的Django版本(例如,forms.RadioSelect.renderer
已经不复存在了,所以您将不得不自己动手做些修改。) >
与上面的自定义窗口小部件一样,此表单字段会将(Model)ChoiceField和“其他选项” CharField合并为一个实体。此自定义字段必须实现compress
方法-作为小部件的decompress
方法的补充。 compress
返回的值用于验证,清理和保存。
(不言自明)
如果默认选择的列表是非常静态的,则只需在模型上进行定义即可(如本文中所述)。否则,您可以在form.__init__
期间分配表单字段的选择。无论哪种方式,您都应将“其他选项”附加到默认选项列表中。
如果这太麻烦了,您可以考虑使用选择字段的实现,这些实现还允许创建新的记录/选择:django-select2或django-autocomplete-light。或者也许已经有这样一个领域了,因为我怀疑您是第一个想要该功能的人。