django自定义Field实现一个字段存储以逗号分隔的字符串_python

实现了在一个字段存储以逗号分隔的字符串,返回一个相应的列表

复制代码 代码如下:

from django import forms
from django.db import models
from django.utils.text import capfirst
from django.core import exceptions

class MultiSelectFormField(forms.MultipleChoiceField):
    widget = forms.CheckboxSelectMultiple

    def __init__(self, *args, **kwargs):
        self.max_choices = kwargs.pop('max_choices', 0)
        super(MultiSelectFormField, self).__init__(*args, **kwargs)

    def clean(self, value):
        if not value and self.required:
            raise forms.ValidationError(self.error_messages['required'])
        # if value and self.max_choices and len(value) > self.max_choices:
        #     raise forms.ValidationError('You must select a maximum of %s choice%s.'
        #             % (apnumber(self.max_choices), pluralize(self.max_choices)))
        return value

class MultiSelectField(models.Field):
    __metaclass__ = models.SubfieldBase

    def get_internal_type(self):
        return "CharField"

    def get_choices_default(self):
        return self.get_choices(include_blank=False)

    def _get_FIELD_display(self, field):
        value = getattr(self, field.attname)
        choicedict = dict(field.choices)

    def formfield(self, **kwargs):
        # don't call super, as that overrides default widget if it has choices
        defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name),
                    'help_text': self.help_text, 'choices': self.choices}
        if self.has_default():
            defaults['initial'] = self.get_default()
        defaults.update(kwargs)
        return MultiSelectFormField(**defaults)

    def get_prep_value(self, value):
        return value

    def get_db_prep_value(self, value, connection=None, prepared=False):
        if isinstance(value, basestring):
            return value
        elif isinstance(value, list):
            return ",".join(value)

    def to_python(self, value):
        if value is not None:
            return value if isinstance(value, list) else value.split(',')
        return ''

    def contribute_to_class(self, cls, name):
        super(MultiSelectField, self).contribute_to_class(cls, name)
        if self.choices:
            func = lambda self, fieldname = name, choicedict = dict(self.choices): ",".join([choicedict.get(value, value) for value in getattr(self, fieldname)])
            setattr(cls, 'get_%s_display' % self.name, func)

    def validate(self, value, model_instance):
        arr_choices = self.get_choices_selected(self.get_choices_default())
        for opt_select in value:
            if (int(opt_select) not in arr_choices):  # the int() here is for comparing with integer choices
                raise exceptions.ValidationError(self.error_messages['invalid_choice'] % value)
        return

    def get_choices_selected(self, arr_choices=''):
        if not arr_choices:
            return False
        list = []
        for choice_selected in arr_choices:
            list.append(choice_selected[0])
        return list

    def value_to_string(self, obj):
        value = self._get_val_from_obj(obj)
        return self.get_db_prep_value(value)

时间: 2024-12-25 10:05:35

django自定义Field实现一个字段存储以逗号分隔的字符串_python的相关文章

关联-一个字段存储多个ID可不可以

问题描述 一个字段存储多个ID可不可以 一个字段存储多个ID 比如电影和演员这样多对多的关系 电影表中用一个字段保存多个演员的id,用分号隔开 这样省去了电影和演员之间的关联表 这样做可以吗?有什么坏处? 解决方案 我见过最奇葩的是,一个程序只用一张表,所有的东西都堆在一起.如果你觉得这样就是"省事",你可以试试,究竟省了多少事. 解决方案二: 可以的,但最好不要这么干.坏处就是,比如页面需要搜索某个女演员的所有电影时,效率就低了 解决方案三: 可以,可以按符号分割,或者自己有规则,然

SQL 把表中字段存储的逗号隔开内容转换成列表形式

原文:[原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式 我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ------>      从左边图转换成右边图,像这种需求,我们难免会遇到.      今天我写了个存储过程来解决这种问题.主要方式是利用master..spt_values表.       具体存储过程如下:        -- Author: LHM -- Create date: 2015-

织梦自定义表单如何取出一个字段的值,并形成option

最近在使用织梦做站的时候,客户用了自定义表单的情况下 其中有一个字段是一个下拉菜单,织梦原带的样式基本不能满足要示,所以自己做了样式,那么怎么才能做到,用户修改了下拉框的值,前台及时做出改变呢, 看了一下代码,发现了大体上流程是这样的 post_diyform.htm中有这样的代码,表示$postform是生成的代码 <?phpecho $postform; ?> 在diy.php中有这样的代码   require_once DEDEINC.'/diyform.cls.php'; $diy =

请问工资管理等系统中的自定义工资结构表字段,以及编辑公式是怎么实现的?大概思路是怎样的?

问题描述 请问工资管理等系统中的自定义工资结构表字段,以及编辑公式是怎么实现的?大概思路是怎样的? 解决方案 解决方案二:你要用什么实现啊?是PHP吗解决方案三:该回复于2010-02-23 09:43:53被版主删除解决方案四:描述太简单了,无法领会楼主意思解决方案五:以sqlserver为例1.动态创建表,就是创建字段就在表里加一个字段,当然可以直接用中文,也可以建一个专门存字段中文和实际名称的关系表2.编辑公式,也很简单,直接用sqlserver的语法规则,比如:基本工资=日工资*36,传

判断一个字段是否在表中的函数

'判断一个字段是否在表中 Function BlnField(sTblName As String, sFldName As String) As Boolean 'sTblName 源表名 '要查找的字段名 Dim fld As Field Dim rs As DAO.Recordset BlnField = False Set rs = CurrentDb.OpenRecordset(sTblName) rs.Fields.Refresh For Each fld In rs.Fields

开启SQL Server Denali之旅:字段存储索引

SQL Server的最近三个版本都贴上了非官方的标签,每一个版本都是为那些大 多数新特性所针对的用户群量身定做的.例如,SQL Server 2005被认为是一个面 向开发者版本,而SQL Server 2008则被看作是一个面向数据管理员的版本.具备 Microsoft PowerPivot数据分析工具并对SQL Server Analysis Services和 Reporting Services功能都进行了改进的SQL Server 2008 R2则是一个众所周知 的商业智能(BI)版

Android如何使用SQLiteOpenHelper在已经存在的数据库中插入一个字段

Andoird的SQLiteOpenHelper类中有一个onUpgrade方法.帮助文档中只是说当数据库升级时该方法被触发.经过实践,解决了我一连串的疑问: 1. 帮助文档里说的"数据库升级"是指什么? 你开发了一个程序,当前是1.0版本.该程序用到了数据库.到1.1版本时,你在数据库的某个表中增加了一个字段.那么软件1.0版本用的数据库在软件1.1版本就要被升级了. 2. 数据库升级应该注意什么? 软件的1.0版本升级到1.1版本时,老的数据不能丢.那么在1.1版本的程序中就要有地

easyUI中将三个输入框的数据顺序拼接在一起存入数据库形成一个字段

问题描述 easyUI中将三个输入框的数据顺序拼接在一起存入数据库形成一个字段 将三个输入框的内容按顺序拼接在一起形成一个字段该如何实现,例如这项数据的年份是可选的,2015年高考语文,期中2015是用下拉列表实现选择的,语文也是下拉列表实现的,最后存储到数据库中是一条数据,就是2015年高考语文 解决方案 循环遍历,拼接字符串,中间加上逗号. 解决方案二: 为了以后方便取值,你可以随便加一些符号分隔开,比如逗号或者问号什么的,这样以后取出来按这个符号split一下就又得到三个字段了 解决方案三

SharePoint 2016 自定义城市和区域字段

前言 最近有这么一个需求,就是用到中国的各种行政区,然后还是三级联动,就琢磨写这么一个字段.然后,觉得挺有意义的,写字段的过程也有点心得,就想到拿到博客里分享给大家,一起看看.  1. 创建字段的解决方案,包括:字段类.字段控件类.字段控件的前台文件.字段的描述文件.城市和区域的数据列表.字段的Feature和其中所需要的JavaScript库和文件. 2. 在字段的前台控件上,添加我们需要的控件,当在显示视图(DispForm)的时候,只有一个Label控件用来显示值,除此之外的视图(NewF