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日期操作学习笔记
Oct 07 Python
python数据结构之二叉树的遍历实例
Apr 29 Python
Python的time模块中的常用方法整理
Jun 18 Python
Pycharm学习教程(1) 定制外观
May 02 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
100行python代码实现跳一跳辅助程序
Jan 15 Python
python selenium 获取标签的属性值、内容、状态方法
Jun 22 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
Nov 20 Python
详解Python字典的操作
Mar 04 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
django admin 添加自定义链接方式
Mar 11 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
Apr 07 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
20个PHP常用类库小结
2011/09/11 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
弹出广告特效(一个IP只弹出一次)的代码
2007/07/27 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
2017/01/20 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
基于python编写的微博应用
2014/10/17 Python
Python多继承原理与用法示例
2018/08/23 Python
python中比较两个列表的实例方法
2019/07/04 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
2019/10/24 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
学生会招新策划书
2014/02/14 职场文书
国庆节演讲稿
2014/05/27 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
军事博物馆观后感
2015/06/05 职场文书
课程设计感想范文
2015/08/11 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
技术入股合作协议书
2016/03/21 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
解决golang结构体tag编译错误的问题
2021/05/02 Golang
Node与Python 双向通信的实现代码
2021/07/16 Javascript
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers