Подтвердить что ты не робот

Модель 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 выбор.

4b9b3361

Ответ 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.