代码之家  ›  专栏  ›  技术社区  ›  AndrewF

用于存储电子邮件地址列表的自定义Django字段

  •  8
  • AndrewF  · 技术社区  · 14 年前

    我正在尝试向Django模型添加一个字段,该模型将表示电子邮件地址列表。我希望用户在管理中输入一个逗号分隔的地址列表,然后我的应用程序将解析该列表以发送一系列电子邮件。

    foo@example.com, bar@example.com ,然后正确地将其写入数据库 [u'foo@example.com', u'bar@example.com'] [u'foo@example.com',u'bar@example.com'] [u"[u'foo@example.com'", u"u'bar@example.com']"] .

    如何将python列表表示转换回字符串,以便在管理中使用?这就是 value_to_string 方法还是需要在其他地方进行转换?

    class EmailListField(models.TextField):
        __metaclass__ = models.SubfieldBase
    
        def to_python(self, value):
            if not value:
                return
            if isinstance(value, list):
                return value
            return [address.strip() for address in value.split(',')]
    
        def get_db_prep_value(self, value):
            if not value:
                return
            return ','.join(unicode(s) for s in value)
    
        def value_to_string(self, obj):
            value = self._get_val_from_obj(obj)
            return self.get_db_prep_value(value)
    

    这是基于 SeparatedValuesField 描述如下: http://www.davidcramer.net/code/181/custom-fields-in-django.html .

    4 回复  |  直到 14 年前
        1
  •  3
  •   hughdbrown    14 年前

    我不会那么做的。我会把你的 EmailListField

        2
  •  3
  •   Thorin Schiffer    11 年前

    这个问题已经解决了,但是可以通过将特定的表示添加到python val中来实现

    class EmailDomainsListField(models.TextField):
        __metaclass__ = models.SubfieldBase
    
        class Presentation(list):
    
            def __unicode__(self):
                return u",".join(self)
            def __str__(self):
                return ",".join(self)
        ...
    
        def to_python(self, value):
            if not value:
                return
            if isinstance(value, EmailDomainsListField.Presentation):
                return value
            return EmailDomainsListField.Presentation([address.strip() for address in        value.split(',')])    
    
        3
  •  1
  •   Cuchac    10 年前

    下面是一个模型字段,其中包含每个电子邮件的验证和正确的管理处理。基于eviltnan和AndrewF的回答。

    from django.core import validators
    from django.db import models
    
    
    class EmailListField(models.CharField):
        __metaclass__ = models.SubfieldBase
    
        class EmailListValidator(validators.EmailValidator):
            def __call__(self, value):
                for email in value:
                    super(EmailListField.EmailListValidator, self).__call__(email)
    
        class Presentation(list):
    
            def __unicode__(self):
                return u", ".join(self)
    
            def __str__(self):
                return ", ".join(self)
    
        default_validators = [EmailListValidator()]
    
        def get_db_prep_value(self, value, *args, **kwargs):
            if not value:
                return
            return ','.join(unicode(s) for s in value)
    
        def value_to_string(self, obj):
            value = self._get_val_from_obj(obj)
            return self.get_db_prep_value(value)
    
        def to_python(self, value):
            if not value:
                return
            if isinstance(value, self.Presentation):
                return value
            return self.Presentation([address.strip() for address in value.split(',')])
    
        4
  •  1
  •   jhonkola    7 年前

    class MultiEmailField(models.TextField):
    
        def to_python(self, value):
    
            if not value:
                return None  # []
    
            cleaned_email_list = list()
            #email_list = filter(None, value.split(','))
            email_list = filter(None, re.split(r';|,\s|\n', value))
    
            for email in email_list:
                if email.strip(' @;,'):
                    cleaned_email_list.append(email.strip(' @;,'))
    
            print cleaned_email_list
            cleaned_email_list = list(set(cleaned_email_list))
    
            return ", ".join(cleaned_email_list)
    
        def validate(self, value, model_instance):
            """Check if value consists only of valid emails."""
    
            # Use the parent's handling of required fields, etc.
            super(MultiEmailField, self).validate(value, model_instance)
    
            email_list = value.split(',')
    
            for email in email_list:
                validate_email(email.strip())