Как добавить MultipleChoiceField для администратора Django? - PullRequest
0 голосов
/ 26 мая 2019

В моей модели есть поле CharField .Я хочу отобразить его как виджет MultipleChoiceField на сайте администратора Django. models.py:

class Product(models.Model):
    ...
    categories = models.CharField()
    ...

Я создал пользовательский виджет форм в forms.py :

from django import forms

CATEGORIES_LIST = [
    ('for_him', 'For Him'),
    ('for_her', 'For Her'),
    ('for_kids', 'For Kids'),
]

class Categories(forms.Form):
    categories = forms.MultipleChoiceField(
        required=False,
        widget=forms.CheckboxSelectMultiple,
        choices=CATEGORIES_LIST,
    )

Не совсем уверенчто делать дальше.Как мне связать этот виджет с Django Admin для моей модели продукта?Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 26 мая 2019

То, что вы пытаетесь сделать, это не так просто, используя CharField и помещая в него несколько опций, поэтому вы должны сначала найти способ сериализации и восстановления данных в модели, посмотрите здесь .

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

from django.contrib.postgres.fields import ArrayField
class ChoiceArrayField(ArrayField):
    """
    A field that allows us to store an array of choices.

    Uses Django 1.9's postgres ArrayField
    and a MultipleChoiceField for its formfield.

    Usage:

        choices = ChoiceArrayField(models.CharField(max_length=..., choices=(...,)), default=[...])
    """

    def formfield(self, **kwargs):
        defaults = {
            'form_class': forms.MultipleChoiceField,
            'choices': self.base_field.choices,
        }
        defaults.update(kwargs)
        return super(ArrayField, self).formfield(**defaults)

, а затем вы можетеиспользуйте ChoiceArrayField на вашей модели

Обновление:

Таким образом, чтобы использовать это на вашей модели, вы можете сделать это следующим образом:

class Product(models.Model):
    categories = ChoiceArrayField(max_length=8, choices=CATEGORIES_LIST, default=['for_him', 'for_her'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...