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之简单主机批量管理工具
Jan 27 Python
Python实现的多线程http压力测试代码
Feb 08 Python
python中urlparse模块介绍与使用示例
Nov 19 Python
Python实现希尔排序算法的原理与用法实例分析
Nov 23 Python
python登录并爬取淘宝信息代码示例
Dec 09 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
Feb 10 Python
python仿evething的文件搜索器实例代码
May 13 Python
python多线程http压力测试脚本
Jun 25 Python
python实现遍历文件夹图片并重命名
Mar 23 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
Mar 24 Python
Python结合Window计划任务监测邮件的示例代码
Aug 05 Python
Django生成数据库及添加用户报错解决方案
Oct 09 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
生成随机字符串和验证码的类的PHP实例
2013/12/24 PHP
PHP实现单例模式最安全的做法
2014/06/13 PHP
php简单smarty入门程序实例
2015/06/11 PHP
php解析url并得到url中的参数及获取url参数的四种方式
2015/10/26 PHP
php中注册器模式类用法实例分析
2015/11/03 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
二级域名转向类
2006/11/09 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
javascript写的日历类(基于pj)
2010/12/28 Javascript
js处理自己不能定义二维数组的方法详解
2014/03/03 Javascript
js中用window.open()打开多个窗口的name问题
2014/03/13 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
举例说明JavaScript中的实例对象与原型对象
2016/03/11 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
Angularjs的Controller间通信机制实例分析
2016/11/07 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
VUE长按事件需求详解
2017/10/18 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
微信小程序当前时间时段选择器插件使用方法详解
2018/12/28 Javascript
JS实现按比例缩小图片宽高
2020/08/24 Javascript
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
python检测主机的连通性并记录到文件的实例
2018/06/21 Python
pytorch如何冻结某层参数的实现
2020/01/10 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
python3跳出一个循环的实例操作
2020/08/18 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
幽灵公主观后感
2015/06/09 职场文书
户外拓展训练感想
2015/08/07 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书