【发布时间】:2020-05-06 14:47:17
【问题描述】:
我在documentation(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)
【问题讨论】:
标签: python django django-forms django-admin