Как изменить значение поля пользовательской модели, отображаемого в админке 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)
Другие вопросы по тегам