Django自定义字段小部件和自定义“ListField”的小部件行为

Django自定义字段小部件和自定义“ListField”的小部件行为,django,model,field,Django,Model,Field,我正在创建以下基于 基本上,我想要实现的是一个字段,在该字段中,您可以编写类似于1、asd、asdf fdgd的内容,它将其存储在数据库中,但在检索时,它应将该字符串作为数组返回,在给定数组时,它应将其转换回逗号分隔的字符串 我仍然不确定到目前为止我写的东西是否有效,但我无法将其显示为输入字段而不是文本区域,即使我设置了widget=TextInput 那么,如何使用标准字符域使用的相同输入在管理中显示它呢? 如何对其进行自定义,使其在此类输入上显示时显示逗号分隔的字符串,但在其他地方访问时作为

我正在创建以下基于

基本上,我想要实现的是一个字段,在该字段中,您可以编写类似于1、asd、asdf fdgd的内容,它将其存储在数据库中,但在检索时,它应将该字符串作为数组返回,在给定数组时,它应将其转换回逗号分隔的字符串

我仍然不确定到目前为止我写的东西是否有效,但我无法将其显示为输入字段而不是文本区域,即使我设置了widget=TextInput

那么,如何使用标准字符域使用的相同输入在管理中显示它呢? 如何对其进行自定义,使其在此类输入上显示时显示逗号分隔的字符串,但在其他地方访问时作为Python列表返回


谢谢

以下是实现您所需的方法

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=256)
    labels = models.TextField()

    def get_labels(self):
        return self.content.split('\n')

    def set_labels(self,value):
        if isinstance(value,list) or isinstance(value,tuple) or isinstance(value,set):
            content = '\n'.join(value)
        else:
            content = value
        self.content = content
可以将标签视为列表字段,使用obj.set_labelslist函数设置值,使用obj.get_标签获取值 它充当列表字段,管理站点将作为普通文本字段运行

这就是我所做的,但一个更好的解决办法除外

更好的方法是在admin.py中使用save_模型:

class BlogAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # extra data handling, prevent data convert
        obj.save()

我以前也遇到过同样的问题,每次保存时都会转换。因此,许多[和]在内容中,这是我遇到的问题。它在shell或views.py中工作,但在管理站点中不起作用,我没有找到更好的方法来解决这个问题,可能是一个转换函数而不是ListField,只需使用TextField或CharField,在models.py中读取、编写类的函数,例如get_content要将内容转换为列表,只需使用obj.get_content而不是obj.content。。。但是除了更好的答案之外,这可能会有所帮助,请替换\n使用分隔符
class BlogAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # extra data handling, prevent data convert
        obj.save()