Как я могу создать определяемое пользователем «Другое» в поле с вариантами в Django?

#python #django #django-models

#python #django #django-модели

Вопрос:

Я кодирую модель в Django, и мне нужны некоторые варианты — но я хотел бы позволить пользователю выбрать «Другое», а затем ввести свой собственный выбор. тоже. Как это можно сделать в 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)
  

Ответ №1:

Если у вас есть поле с, 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 , а затем обойти проверку Django вашего choices , поскольку это, вероятно, заблокирует его.

Ответ №2:

Я бы использовал надлежащий внешний ключ с django-autocomplete-light v.3.

У него есть отличная функция создания новых вариантов на лету.

Более того, вы можете настроить набор запросов так, чтобы он обслуживал только те варианты, которые вы отметили как подходящие (например, в логическом поле), и игнорировать любые другие, но принимать новые варианты (если это имеет смысл).

Этого также можно достичь с помощью limit_choices_to .

Вы даже можете использовать прокси-модель, чтобы контролировать вставленные пользователем данные по сравнению с данными, которые в противном случае были бы в кортеже вариантов.

Я считаю варианты отличным инструментом для предоставления редко изменяющихся параметров для внешнего ключа.

Согласно моему опыту, переопределение и искажение основной цели выбора обеспечивает посредственный результат, который включает в себя много избыточного кодирования.

Комментарии:

1. django-autocomplete-light, похоже, дублирует некоторые функции, для которых я использую django-easy-select2. Стоит ли переходить на dal? Вы правы, я попытаюсь сначала посмотреть, достаточно ли использовать статические варианты выбора.

2. @randomshinichi На самом деле я не использовал ничего другого, кроме dal, поэтому я не могу сравнивать. Возможно, что это каким-то образом полнофункционально, но мне ничего не нужно, и это не охвачено. В любом случае, лучшая стратегия — начать просто и улучшать при необходимости.