Django认证用户截断电子邮件字段

9

我遇到了django.contrib.auth用户模型中电子邮件的最大长度为75个字符的问题。

我从Facebook API接收的电子邮件地址超过75个字符,我希望能够将它们存储在用户中,以便于在来自Facebook连接和其他用户之间保持连续性。

我可以通过手动编辑我们的MySQL数据库中的字段来解决"Data truncated for column 'email' at row 1"问题,但是有没有更好的解决方法?最好不要涉及每次重置模式更改时都需要手动编辑数据库。

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

2个回答

12

Django中EmailField字段的长度硬编码为75个字符。您可以像这样修复它:

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)

在双向情况下,最好将此代码放入任何模块的init()函数中,位于INSTALLED_APPS中的django.contrib.auth之前。

自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'

1
糟糕...这太糟糕了 :( 为什么Facebook给我这些巨大的电子邮件地址? - Jiaaro
好吧,有点糟糕,但你还有其他选择:编写自己的django.contrib.auth模块(顺便说一句,如果你发现内置的auth存在更多问题,这并不是最糟糕的事情)。 - rombarcz
不再工作了。在应用程序加载完成之前,它不会让你这样做,并且会出现“应用程序尚未加载”的错误。 - Shayne

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接