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


Posted in Python onApril 27, 2014

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

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)
Python 相关文章推荐
线程和进程的区别及Python代码实例
Feb 04 Python
python中日志logging模块的性能及多进程详解
Jul 18 Python
Python更新数据库脚本两种方法及对比介绍
Jul 27 Python
浅谈解除装饰器作用(python3新增)
Oct 15 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
Python实现计算文件MD5和SHA1的方法示例
Jun 11 Python
Python 给定的经纬度标注在地图上的实现方法
Jul 05 Python
python 日期排序的实例代码
Jul 11 Python
Python 转换RGB颜色值的示例代码
Oct 13 Python
python中seaborn包常用图形使用详解
Nov 25 Python
python如何删除列为空的行
Jul 17 Python
Python中的 enumerate和zip详情
May 30 Python
python监控网卡流量并使用graphite绘图的示例
Apr 27 #Python
python抓取网页图片示例(python爬虫)
Apr 27 #Python
python实现sublime3的less编译插件示例
Apr 27 #Python
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 #Python
Python设计模式之单例模式实例
Apr 26 #Python
Python设计模式之观察者模式实例
Apr 26 #Python
Python设计模式之代理模式实例
Apr 26 #Python
You might like
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
flash 得到自身url参数的代码
2009/11/15 Javascript
JavaScript 代码压缩工具小结
2012/02/27 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
js与C#进行时间戳转换
2014/11/14 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
2016/08/02 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
JS实现轮播图效果
2020/01/11 Javascript
Vue实现指令式动态追加小球动画组件的步骤
2020/12/18 Vue.js
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
Win10下用Anaconda安装TensorFlow(图文教程)
2020/06/18 Python
python3处理word文档实例分析
2020/12/01 Python
马耳他航空公司官方网站:Air Malta
2019/05/15 全球购物
建筑工程专业毕业生自荐信
2013/10/19 职场文书
会计毕业生自我鉴定
2013/11/04 职场文书
机械设计职业生涯规划书
2013/12/27 职场文书
八年级数学教学反思
2014/01/31 职场文书
材料物理专业求职信
2014/09/01 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
纪委立案决定书
2015/06/24 职场文书
高一地理教学工作总结
2015/08/12 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
竞聘演讲报告:基本写作有哪些?附开头范文
2019/10/16 职场文书
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏