【问题标题】:django auth User truncating email fielddjango auth 用户截断电子邮件字段
【发布时间】:2010-10-29 06:59:09
【问题描述】:

我对电子邮件 max_length 为 75 的 django.contrib.auth 用户模型有疑问。

我从 facebook api 收到超过 75 个字符的电子邮件地址,我需要(非常希望)将它们存储在用户中,以便来自 facebook connect 和其他用户的连续性。

我可以通过手动编辑我们的 mySql 数据库中的字段来解决“Data truncated for column 'email' at row 1”的问题,但是有没有更好的方法来解决这个问题?最好是 每次我为架构更改重置数据库时,不需要我手动编辑数据库

只要可以将数据库添加到重置脚本或 initial_data.json 文件中,我就可以编辑数据库。

【问题讨论】:

    标签: python mysql django authentication


    【解决方案1】:

    EmailField 75 字符长度在 django 中是硬编码的。你可以这样解决这个问题:

    from django.db.models.fields import EmailField
    def email_field_init(self, *args, **kwargs):
      kwargs['max_length'] = kwargs.get('max_length', 200)
      CharField.__init__(self, *args, **kwargs)
    EmailField.__init__ = email_field_init
    

    但这会改变所有 EmailField 字段的长度,因此您也可以尝试:

    from django.contrib.auth.models import User
    from django.utils.translation import ugettext as _
    from django.db import models
    User.email = models.EmailField(_('e-mail address'), blank=True, max_length=200)
    

    最好在 INSTALLED_APPS 中的 django.contrib.auth 之前将此代码放在任何模块的 init 中

    从 Django 1.5 开始,您可以使用自己的基于 AbstractUser 模型的自定义模型,因此您可以使用自己的字段和长度。 在您的模型中:

    from django.contrib.auth.models import AbstractUser
    from django.db import models
    
    class User(AbstractUser):
        email = models.EmailField(_('e-mail address'), blank=True, max_length=200)
    

    在设置中:

    AUTH_USER_MODEL = 'your_app.models.User'
    

    【讨论】:

    • ick... 太糟糕了 :( 为什么 facebook 会给我这些巨大的电子邮件地址?
    • 好吧,有点糟糕,无论如何你还有其他选择:编写你自己的 django.contrib.auth 模块(顺便说一句,如果你在 buildin auth 中看到更多这样的麻烦,这并不是最糟糕的事情)
    • 别再工作了。在加载应用程序之前,它不会让你这样做,并且会出现“应用程序尚未加载”的错误
    【解决方案2】:

    现在有一张票可以增加 Django 中电子邮件字段的长度:http://code.djangoproject.com/ticket/11579

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多