手机
当前位置:查字典教程网 >脚本专栏 >python >django自定义Field实现一个字段存储以逗号分隔的字符串
django自定义Field实现一个字段存储以逗号分隔的字符串
摘要:实现了在一个字段存储以逗号分隔的字符串,返回一个相应的列表复制代码代码如下:fromdjangoimportformsfromdjango....

实现了在一个字段存储以逗号分隔的字符串,返回一个相应的列表

复制代码 代码如下:

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)

【django自定义Field实现一个字段存储以逗号分隔的字符串】相关文章:

一篇不错的Python入门教程

Python模块学习 re 正则表达式

Django集成百度富文本编辑器uEditor攻略

python re正则表达式模块(Regular Expression)

python连接mysql调用存储过程示例

windows下wxPython开发环境安装与配置方法

使用python BeautifulSoup库抓取58手机维修信息

python算法学习之计数排序实例

python实现跨文件全局变量的方法

用Python输出一个杨辉三角的例子

精品推荐
分类导航