我有这段代码:
import re
import six
from django.core.validators import validate_email
from django.db.models import TextField, SubfieldBase
class EmailsListField(TextField):
__metaclass__ = SubfieldBase
email_separator_re = re.compile(r'\s*,\s*')
def to_python(self, value):
if isinstance(value, six.string_types):
return [x for x in self.email_separator_re.split(value) if x]
else:
return list(value)
def validate(self, value, model_instance):
super(EmailsListField, self).validate(value, model_instance)
for email in value:
validate_email(email)
def get_prep_value(self, value):
if isinstance(value, six.string_types):
return value
else:
return ', '.join(value)
它旨在接受来自文本框的许多电子邮件,验证并存储它们。它将它们保存为数据库中的文本(例如“jim@mail.com,lauren@mail.com”)。一切都按预期工作,除了在管理文本框和列表视图中(可能在其他地方)。值显示为u“['jim@mail.com','lauren@mail.com']”。当然,这是一种无效的格式,也是一种丑陋的格式。
如何更改此项,以便在文本框和列表视图中显示为“jim@mail.com,lauren @mail.com”?
答案 0 :(得分:0)
感谢@arocks和@eviltnan。
这个答案对我有用:https://stackoverflow.com/a/20545049/1813277。简而言之,自定义列表子类与覆盖的__str__
函数一起使用。
这是我的最终解决方案:
import re
import six
from django.core.validators import validate_email
from django.db.models import TextField, SubfieldBase
class EmailsListField(TextField):
__metaclass__ = SubfieldBase
email_separator_re = re.compile(r'\s*,\s*')
class AdminList(list):
def __str__(self):
return str(', '.join(self))
def __unicode__(self):
return unicode(', '.join(self))
def to_python(self, value):
if isinstance(value, six.string_types):
return self.AdminList([x for x in self.email_separator_re.split(value) if x])
else:
return self.AdminList(value)
def validate(self, value, model_instance):
super(EmailsListField, self).validate(value, model_instance)
for email in value:
validate_email(email)
def get_prep_value(self, value):
if isinstance(value, six.string_types):
return value
else:
return ', '.join(value)