Я написал настраиваемое поле, как показано ниже, в соответствии с документацией (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)