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创建一个最简单http webserver服务器的方法
May 08 Python
python WindowsError的错误代码详解
Jul 23 Python
Python绘制KS曲线的实现方法
Aug 13 Python
python常用函数与用法示例
Jul 02 Python
mac系统下Redis安装和使用步骤详解
Jul 09 Python
django admin 自定义替换change页面模板的方法
Aug 23 Python
Python csv模块使用方法代码实例
Aug 29 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
Feb 11 Python
Python实现病毒仿真器的方法示例(附demo)
Feb 19 Python
Selenium元素定位的30种方式(史上最全)
May 11 Python
python语言实现贪吃蛇游戏
Nov 13 Python
python基于pexpect库自动获取日志信息
Feb 01 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/08/06 PHP
YII Framework教程之异常处理详解
2016/03/14 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
2019/04/03 PHP
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
2008/12/29 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
灵活应用js调试技巧解决样式问题的步骤分享
2012/03/15 Javascript
location对象的属性和方法应用(解析URL)
2013/04/12 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
2014/03/28 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
2016/10/13 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
2016/12/14 Javascript
bootstrap3-dialog-master模态框使用详解
2017/08/22 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
Layui多选只有最后一个值的解决方法
2019/09/02 Javascript
ant design 日期格式化的实现
2020/10/27 Javascript
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
2017/06/27 Python
浅谈Python脚本开头及导包注释自动添加方法
2018/10/27 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
使用python+whoosh实现全文检索
2019/12/09 Python
让IE支持HTML5的方法
2012/12/11 HTML / CSS
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
小学校园广播稿(3篇)
2014/09/19 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
教师节倡议书2015
2015/04/27 职场文书
同学会感言
2015/07/30 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
python playwright之元素定位示例详解
2022/07/23 Python