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实现一个转存纯真IP数据库的脚本分享
May 21 Python
Python实现一个简单的验证码程序
Nov 03 Python
Python简单生成随机姓名的方法示例
Dec 27 Python
python发送邮件脚本
May 22 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
基于Python的Post请求数据爬取的方法详解
Jun 14 Python
Django Rest framework解析器和渲染器详解
Jul 25 Python
浅析pandas 数据结构中的DataFrame
Oct 12 Python
Django通过json格式收集主机信息
May 29 Python
python speech模块的使用方法
Sep 09 Python
python利用tkinter实现图片格式转换的示例
Sep 28 Python
Python中使用Opencv开发停车位计数器功能
Apr 04 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支持多种格式图片上传(支持jpg、png、gif)
2011/11/03 PHP
自己在做项目过程中学到的PHP知识收集
2012/08/20 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
php上传文件问题汇总
2015/01/30 PHP
PHP实现Redis单据锁以及防止并发重复写入
2018/04/10 PHP
php/JS实现的生成随机密码(验证码)功能示例
2019/06/06 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
JavaScript Archive Network 集合
2007/05/12 Javascript
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
Script的加载方法小结
2011/01/12 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
AngularJS 自定义指令详解及示例代码
2016/08/17 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
聊聊Vue中provide/inject的应用详解
2019/11/10 Javascript
[48:52]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第一局
2016/02/25 DOTA
如何基于Python创建目录文件夹
2019/12/31 Python
tensorflow指定GPU与动态分配GPU memory设置
2020/02/03 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
全球最大的服务市场:Fiverr
2017/01/03 全球购物
Wedgwood英国官方网站:英式精致骨瓷餐具、礼品与生活精品,源于1759年
2019/09/02 全球购物
世界上最大的乐谱选择:Sheet Music Plus
2020/01/18 全球购物
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
校园活动宣传方案
2014/03/28 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
实名检举信范文
2015/03/02 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
详解mysql三值逻辑与NULL
2021/05/19 MySQL
Python字典的基础操作
2021/11/01 Python