Django auth 用户邮箱字段被截断

9 投票
2 回答
2648 浏览
提问于 2025-04-15 11:51

我在使用django.contrib.auth的用户模型时遇到了一个问题,那个模型里的邮箱长度限制是75个字符。

我从Facebook的接口收到了一些超过75个字符的邮箱地址,我希望能把这些邮箱存储在用户信息里,这样可以保持Facebook用户和其他用户之间的一致性。

我可以通过手动编辑我们的MySQL数据库来解决“Data truncated for column 'email' at row 1”这个问题,但有没有更好的解决办法呢?最好是那种不需要我每次重置数据库时都手动编辑的方法。

只要我能把修改加到重置脚本里,或者放到initial_data.json文件中,我是可以接受编辑数据库的。

2 个回答

2

现在有一个提案,想要在Django中增加电子邮件字段的长度:http://code.djangoproject.com/ticket/11579

12

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之前。

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

撰写回答