Модель Django MultipleChoice
Я знаю, что для Модели не существует MultipleChoiceField
, вы можете использовать его только в Forms.
Сегодня я сталкиваюсь с проблемой при анализе нового проекта, связанного с множественными выборами.
Я хотел бы иметь поле типа CharField
с choices
с возможностью множественного выбора.
Я решил эту проблему еще раз, создав CharField
и управляя несколькими вариантами в форме с помощью forms.MultipleChoiceField
и сохраняя выбор, разделенный запятыми.
В этом проекте из-за конфигурации я не могу это сделать, как я упоминал выше, мне нужно сделать это в моделях, и я предпочитаю НЕ редактировать форму администратора Django . Мне нужно поле модели с несколькими вариантами выбора
- Кто-нибудь решил что-то подобное с помощью моделей?
Может быть, переопределение некоторых функций моделей или использование пользовательского виджета... Я не знаю, я здесь потерял.
Изменить
Мне известно о простых вариантах, я хотел бы иметь что-то вроде:
class MODEL(models.Model):
MY_CHOICES = (
('a', 'Hola'),
('b', 'Hello'),
('c', 'Bonjour'),
('d', 'Boas'),
)
...
...
my_field = models.CharField(max_length=1, choices=MY_CHOICES)
...
но с возможностью сохранения нескольких вариантов не только 1 выбор.
Ответы
Ответ 1
Вам нужно подумать о том, как вы собираетесь хранить данные на уровне базы данных. Это будет определять ваше решение.
Предположительно, вам нужен один столбец в таблице, который хранит несколько значений. Это также заставит вас задуматься о том, как будет сериализоваться - например, вы не можете просто разделять запятую, если вам нужно хранить строки, которые могут содержать запятые.
Однако лучше всего использовать решение, подобное одному из следующих:
Ответ 2
Если вы используете Postgres, подумайте об использовании ArrayField.
from django.db import models
from django.contrib.postgres.fields import ArrayField
class WhateverModel(models.Model):
WHATEVER_CHOICE = u'1'
SAMPLE_CHOICES = (
(WHATEVER_CHOICE, u'one'),
)
choices = ArrayField(
models.CharField(choices=SAMPLE_CHOICES, max_length=2, blank=True, default=WHATEVER_CHOICE),
)
Ответ 3
Из двух https://pypi.python.org/pypi/django-select-multiple-field/ выглядит более округлым и полным. У него даже есть хороший набор unittests.
Проблема, которую я обнаружил, заключается в том, что она выдает предупреждение об отмене Django 1.10 в классе, который реализует поле модели.
Я исправил это и отправил PR. Последний код, пока они не сольют мой PR (если они когда-либо решат хе-хе), находится в моей вилке репо, здесь: https://github.com/matiasherranz/django-select-multiple-field
Ура!
М.-
Ответ 4
Если вы хотите, чтобы виджет выглядел как текстовый ввод и по-прежнему позволял выбирать несколько вариантов из предложений, вы можете искать Select2. Существует также django-select2, который интегрирует его с Django Forms и Admin.