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自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
Python实现的ini文件操作类分享
Nov 20 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
python实现nao机器人身体躯干和腿部动作操作
Apr 29 Python
使用selenium和pyquery爬取京东商品列表过程解析
Aug 15 Python
解决pycharm最左侧Tool Buttons显示不全的问题
Dec 17 Python
对python中各个response的使用说明
Mar 28 Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 Python
在python中list作函数形参,防止被实参修改的实现方法
Jun 05 Python
Python venv虚拟环境配置过程解析
Jul 08 Python
PyQt5的相对布局管理的实现
Aug 07 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
Feb 02 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
随时给自己贴的图片加文字的php水印
2007/03/16 PHP
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
Vue0.1的过滤代码如何添加到Vue2.0直接使用
2017/08/23 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
ReactJS实现表单的单选多选和反选的示例
2017/10/13 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
如何以Angular的姿势打开Font-Awesome详解
2018/04/22 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
python模拟鼠标拖动操作的方法
2015/03/11 Python
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
美国在线工具商店:Acme Tools
2018/06/26 全球购物
《夕阳真美》教学反思
2014/04/27 职场文书
我们的节日中秋活动方案
2014/08/19 职场文书
检讨书范文2000字
2015/01/28 职场文书
2015年社区流动人口工作总结
2015/05/12 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js
Nginx安装配置详解
2022/06/25 Servers