【问题标题】:How to change the value of custom model field displayed in django admin如何更改 django admin 中显示的自定义模型字段的值
【发布时间】:2014-02-11 23:11:11
【问题描述】:

我有这个代码:

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”?

【问题讨论】:

标签: django django-models django-forms django-custom-field


【解决方案1】:

感谢@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2011-05-07
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多