Python Django逗号分隔字段不适用于管理站点
我在(Django 3.0)之后编写了一个自定义字段,如下所示。 此字段允许存储逗号分隔字符串的列表 我的问题是,在管理站点中填充表单字段时,也会调用Python Django逗号分隔字段不适用于管理站点,python,django,django-forms,django-admin,Python,Django,Django Forms,Django Admin,我在(Django 3.0)之后编写了一个自定义字段,如下所示。 此字段允许存储逗号分隔字符串的列表 我的问题是,在管理站点中填充表单字段时,也会调用from\u db\u value 例如,假设数据库中的值为alpha,beta,表示Python列表['alpha','beta']。如果我想更改模型实例,表单将填充字符串['alpha','beta']。 这并不可怕,但当我保存模型实例时(不接触此字段),新值将变为[“['alpha'”,'beta']”]!换句话说,表单字段的输入随后被解释为
from\u db\u value
例如,假设数据库中的值为alpha,beta
,表示Python列表['alpha','beta']
。如果我想更改模型实例,表单将填充字符串['alpha','beta']
。
这并不可怕,但当我保存模型实例时(不接触此字段),新值将变为[“['alpha'”,'beta']”]
!换句话说,表单字段的输入随后被解释为逗号分隔的列表
为了拥有一个可用的管理站点,正确的方法是什么
class CommaSepField(models.CharField):
description=“以逗号分隔的字符串列表”
定义初始值(self,separator=“,”,*args,**kwargs):
self.separator=分隔符
super()
def解构(自我):
名称、路径、参数、kwargs=super().deconstruct()
#如果不是默认值,则仅包括kwarg
如果自动分隔符!=",":
kwargs['separator']=自分隔符
返回名称、路径、参数、kwargs
def from_db_value(自身、值、表达式、连接):
打印('此处',值)
如果值为“无”:
返回值
返回值.split(self.separator)
定义到python(自身,值):
如果值为“无”:
一无所获
elif isinstance(值、列表):
返回值
其他:
返回值.split(self.separator)
def get_prep_值(自身,值):
如果值为“无”:
一无所获
其他:
返回self.separator.join(值)
有两种选择
初始值设置为数据库中的值(例如alpha,beta
),而不是Python表示(例如['alpha',beta']
)
class CommaSepField(models.CharField):
description=“以逗号分隔的字符串列表”
定义初始值(self,separator=“,”,*args,**kwargs):
self.separator=分隔符
super()
def解构(自我):
名称、路径、参数、kwargs=super().deconstruct()
#如果不是默认值,则仅包括kwarg
如果自动分隔符!=",":
kwargs['separator']=自分隔符
返回名称、路径、参数、kwargs
def from_db_value(自身、值、表达式、连接):
返回self.to_python(值)
定义到python(自身,值):
如果值为“无”:
一无所获
elif isinstance(值、列表):
返回值
其他:
literal=\u eval\u from\u string\u if\u literal\u type(值,列表)
value=self。如果literal不是None-else值,则获取值(literal)
返回值.split(self.separator)
def get_prep_值(自身,值):
如果值为“无”:
一无所获
其他:
返回self.separator.join(值)
如果文字类型(字符串,文字类型)为文字,则从字符串中定义值:
“”“尝试从字符串中获取文本值
这对于Django管理表单很有用,您可以在其中接收字符串作为输入
文本的表示法,如dict或list。
"""
如果isinstance(字符串,str):
尝试:
结果=ast.literal\u eval(字符串)
如果isinstance(结果、文字类型):
返回结果
除了(ValueError,SyntaxError):
通过
一无所获
有两种选择
初始值设置为数据库中的值(例如alpha,beta
),而不是Python表示(例如['alpha',beta']
)
class CommaSepField(models.CharField):
description=“以逗号分隔的字符串列表”
定义初始值(self,separator=“,”,*args,**kwargs):
self.separator=分隔符
super()
def解构(自我):
名称、路径、参数、kwargs=super().deconstruct()
#如果不是默认值,则仅包括kwarg
如果自动分隔符!=",":
kwargs['separator']=自分隔符
返回名称、路径、参数、kwargs
def from_db_value(自身、值、表达式、连接):
返回self.to_python(值)
定义到python(自身,值):
如果值为“无”:
一无所获
elif isinstance(值、列表):
返回值
其他:
literal=\u eval\u from\u string\u if\u literal\u type(值,列表)
value=self。如果literal不是None-else值,则获取值(literal)
返回值.split(self.separator)
def get_prep_值(自身,值):
如果值为“无”:
一无所获
其他:
返回self.separator.join(值)
如果文字类型(字符串,文字类型)为文字,则从字符串中定义值:
“”“尝试从字符串中获取文本值
这对于Django管理表单很有用,您可以在其中接收字符串作为输入
文本的表示法,如dict或list。
"""
如果isinstance(字符串,str):
尝试:
结果=ast.literal\u eval(字符串)
如果isinstance(结果、文字类型):
返回结果
除了(价值)