#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, поэтому я не могу сравнивать. Возможно, что это каким-то образом полнофункционально, но мне ничего не нужно, и это не охвачено. В любом случае, лучшая стратегия — начать просто и улучшать при необходимости.