如何在Django中的Choices字段中为用户定义“Other”?

时间:2016-10-21 13:20:11

标签: python django django-models

我正在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)

2 个答案:

答案 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是一个很好的工具,可以为外键提供很少变化的选项。

根据我的经验,压倒和搞乱选择的基本目的,提供了一个平庸的结果,涉及大量的冗余编码。