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中使用group_by的方法
May 26 Python
Python 爬虫模拟登陆知乎
Sep 23 Python
Python实现excel转sqlite的方法
Jul 17 Python
Python排序搜索基本算法之归并排序实例分析
Dec 08 Python
python负载均衡的简单实现方法
Feb 04 Python
python3实现逐字输出的方法
Jan 23 Python
Python性能分析工具Profile使用实例
Nov 19 Python
python with语句的原理与用法详解
Mar 30 Python
Python调用shell命令常用方法(4种)
May 11 Python
浅谈keras使用中val_acc和acc值不同步的思考
Jun 18 Python
SpringBoot首页设置解析(推荐)
Feb 11 Python
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
木翼下载系统中说明的PHP安全配置方法
2007/06/16 PHP
php设置编码格式的方法
2013/03/05 PHP
Thinkphp实现MySQL读写分离操作示例
2014/06/25 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
2010/04/25 Javascript
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
JS+CSS制作DIV层可(最小化/拖拽/排序)功能实现代码
2013/02/25 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
javascript根据像素点取位置示例
2014/01/27 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
python3 shelve模块的详解
2017/07/08 Python
Python中dict和set的用法讲解
2019/03/28 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
2019/08/30 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
keras 多任务多loss实例
2020/06/22 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
专科毕业生求职简历的自我评价
2013/10/12 职场文书
冰淇淋开店创业计划书
2014/02/01 职场文书
介绍信样本
2015/01/31 职场文书