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 相关文章推荐
django+xadmin+djcelery实现后台管理定时任务
Aug 14 Python
pycharm安装和首次使用教程
Aug 27 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
Apr 12 Python
python的debug实用工具 pdb详解
Jul 12 Python
使用python telnetlib批量备份交换机配置的方法
Jul 25 Python
python matplotlib库直方图绘制详解
Aug 10 Python
Golang GBK转UTF-8的例子
Aug 26 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
Sep 04 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
Feb 17 Python
vscode写python时的代码错误提醒和自动格式化的方法
May 07 Python
在Keras中CNN联合LSTM进行分类实例
Jun 29 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 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函数式编程简单示例
2019/08/08 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
vue中如何使用ztree
2018/02/06 Javascript
Vue 实现手动刷新组件的方法
2019/02/19 Javascript
Layui实现带查询条件的分页
2019/07/27 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
python装饰器实例大详解
2017/10/25 Python
Python requests设置代理的方法步骤
2020/02/23 Python
pycharm设置默认的UTF-8编码模式的方法详解
2020/06/01 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
作为网站管理者应当如何防范XSS
2014/08/16 面试题
事业单位竞聘上岗实施方案
2014/03/28 职场文书
政府信息公开实施方案
2014/05/09 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
小学教师自我剖析材料
2014/09/29 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
2015年学校教育教学工作总结
2015/04/22 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
纪录片信仰观后感
2015/06/08 职场文书
欢送领导祝酒词
2015/08/12 职场文书
python实战之用emoji表情生成文字
2021/05/08 Python
python tqdm用法及实例详解
2021/06/16 Python
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis