我正在Django中编写一个模型,我需要一些选择 - 但我想让用户选择'Other'然后输入他们自己的选择。怎么能在Django中完成?
class Client(models.Model):
ENTITY_TYPE_CHOICES = (
('publicly_traded', 'Publicly Traded Company'),
('limited_liability', 'Limited Liability Company'),
('partnership', 'Partnership'),
('ngo', 'NGO'),
)
...
entity_type = models.CharField(choices=ENTITY_TYPE_CHOICES)
答案 0 :(得分:2)
如果您的字段为choices
,则可能不希望添加不在指定选项中的dirty
值。
当我必须实现这样的东西时,我在我的模型中添加了另一个CharField
,专门用于存储我的主要字段中的其他选项,例如:
my_choices_field = CharField(choices=MY_CHOICES, max_length=64)
my_choices_field_other = CharField(max_length=64)
然后,在我的模板中,我会渲染它们,并在Form
中我验证用户只能填写其中一个字段,例如
def clean(self):
...
if my_choices_field and my_choices_field_other: # Both are filled, raise error
raise ValidationError("Please select one or type other 'my_choice', not both.")
如果你真的想要使用相同的字段,你可能需要使用一些JavaScript来手动向select
添加选项,然后解决你的choices
的Django验证问题。我可能会阻止它。
答案 1 :(得分:1)
我会使用django-autocomplete-light v.3的正确ForeignKey。
它具有创建新选择on the fly的绝佳功能。
此外,您可以adjust the queryset仅提供您已经标记为适当的选项(例如,在布尔字段中)并忽略任何其他选项,但接受新选择(如果这是有意义的话)。
这也可以使用limit_choices_to
来实现。
您甚至可以使用proxy model来控制用户插入的数据与选择元组中的数据之间的对比。
我认为choices是一个很好的工具,可以为外键提供很少变化的选项。
根据我的经验,压倒和搞乱选择的基本目的,提供了一个平庸的结果,涉及大量的冗余编码。