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实现爬取千万淘宝商品的方法
Jun 30 Python
python 获取网页编码方式实现代码
Mar 11 Python
Python实现识别手写数字大纲
Jan 29 Python
pandas中去除指定字符的实例
May 18 Python
实践Vim配置python开发环境
Jul 02 Python
详解Python3 基本数据类型
Apr 19 Python
PyQt Qt Designer工具的布局管理详解
Aug 07 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
Mar 25 Python
带你学习Python如何实现回归树模型
Jul 16 Python
python使用列表的最佳方案
Aug 12 Python
python 如何获取页面所有a标签下href的值
May 06 Python
Python集合set()使用的方法详解
Mar 18 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 str_pad 函数使用详解
2009/01/13 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
关于php开启错误提示的总结
2019/09/24 PHP
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
基于jquery & json的省市区联动代码
2012/06/26 Javascript
javaScript中的this示例学习详解及工作原理
2014/01/13 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
Angular中的$watch、$watchGroup、$watchCollection
2017/06/25 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
Python聊天室程序(基础版)
2018/04/01 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
python xlsxwriter创建excel图表的方法
2018/06/11 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
Python 3.8 新功能全解
2019/07/25 Python
Python读写文件模式和文件对象方法实例详解
2019/09/17 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
大学生求职自我评价
2014/01/16 职场文书
家长学校实施方案
2014/03/15 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
自主招生推荐信怎么写
2015/03/26 职场文书
房租涨价通知
2015/04/23 职场文书
小学体育教学随笔
2015/08/14 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
vue3获取当前路由地址
2022/02/18 Vue.js
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS