Как изменить значение поля пользовательской модели, отображаемого в админке django
У меня есть этот код:
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" как в текстовых полях, так и в виде списка?
1 ответ
Спасибо @arocks и @eviltnan.
Этот ответ работает для меня: /questions/21510842/polzovatelskoe-pole-django-dlya-hraneniya-spiska-adresov-elektronnoj-pochtyi/21510856#21510856. Короче говоря, пользовательский подкласс списка используется с перезаписанным __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)