Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django逗号分隔字段不适用于管理站点_Python_Django_Django Forms_Django Admin - Fatal编程技术网

Python Django逗号分隔字段不适用于管理站点

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']”]!换句话说,表单字段的输入随后被解释为

我在(Django 3.0)之后编写了一个自定义字段,如下所示。 此字段允许存储逗号分隔字符串的列表

我的问题是,在管理站点中填充表单字段时,也会调用
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(结果、文字类型):
    返回结果
    除了(价值)