Django Поле, разделенное запятыми, не работает с сайтом администратора - PullRequest
1 голос
/ 06 мая 2020

Я написал настраиваемое поле, как показано ниже, в соответствии с документацией (Django 3.0). Это поле позволяет хранить список строк, разделенных запятыми.

Моя проблема в том, что from_db_value вызывается также при заполнении поля формы на сайте администратора.

Например, предположим, что значение в базе данных alpha,beta, представляющее список Python ['alpha', 'beta']. Если я хочу изменить экземпляр модели, форма заполняется строкой ['alpha', 'beta']. Это было бы не страшно, но когда я сохраняю экземпляр модели (не касаясь этого поля), новое значение становится ["['alpha'", " 'beta']"]! Другими словами, ввод в поле формы затем интерпретируется как список, разделенный запятыми.

Как правильно с этим справиться, чтобы иметь удобный административный сайт?

class CommaSepField(models.CharField):
    description = "A comma-separated list of strings"

    def __init__(self, separator=",", *args, **kwargs):
        self.separator = separator
        super().__init__(*args, **kwargs)

    def deconstruct(self):
        name, path, args, kwargs = super().deconstruct()
        # Only include kwarg if it's not the default
        if self.separator != ",":
            kwargs['separator'] = self.separator
        return name, path, args, kwargs

    def from_db_value(self, value, expression, connection):
        print('here', value)
        if value is None:
            return value
        return value.split(self.separator)

    def to_python(self, value):
        if value is None:
            return None
        elif isinstance(value, list):
            return value
        else:
            return value.split(self.separator)

    def get_prep_value(self, value):
        if value is None:
            return None
        else:
            return self.separator.join(value)
...