【问题标题】:How to override default user model field in Django?如何覆盖 Django 中的默认用户模型字段?
【发布时间】:2010-02-15 00:59:52
【问题描述】:

问题是默认用户模型没有为字段提供一些非常有用的选项,例如 unique=True 到电子邮件字段。

我阅读了这个问题:Override default User model method,并检查了Proxy Model 的概念,但没有任何效果。

一开始我试过:

from django.contrib.auth import models
class User(models.User):
    class Meta:
        proxy = True
    email = EmailField('e-mail address', unique=True, blank=False)

导致:

django.core.exceptions.FieldError: Proxy model 'User' contains model fields.

接下来是:

from django.contrib.auth import models
class User(models.User):
    class Meta:
        proxy = True
    models.User.email = EmailField('e-mail address', unique=True, blank=False)

这个“解决方案”根本没有效果。默认用户模型的行为与以前相同。

我只对非猴子补丁解决方案感兴趣。

编辑:好的。猴子修补对我来说是可以接受的,但如何合理地做到这一点? (我的意思是不更改位于/usr/pyshared/python2.6/... 中的文件)

【问题讨论】:

  • 啊,来吧...只是一点的胡闹? :-) 不幸的是,我认为你不会找到你真正想要的东西。 每个人都想以一种或另一种方式调整 User 模型,但您发现 Django 数据库“类”不是 Python 类,特别是在覆盖父母。 docs.djangoproject.com/en/dev/topics/db/models/…
  • 如果语言本身在内部支持猴子补丁就足够了 ;-) 例如,Ruby 中的类是开放的,因此您可以在运行时更改甚至内置类的实现,从而更改用户模型在 Ruby 中最多可以调整 3 行。无论如何,谢谢你的回复。你知道如何使这种猴子修补合理吗?

标签: django django-models


【解决方案1】:

这个已经问过了...How to make email field unique in model User from contrib.auth in Django

另外用户数据的django方法在这里http://docs.djangoproject.com/en/dev/topics/auth/#auth-profiles

我并不完全喜欢这种方法,我很欣赏你来自哪里,但有时你必须随波逐流。

【讨论】:

  • 感谢您的回复。首先,我正在寻找一种方法来添加到用户模型,而不仅仅是电子邮件字段唯一性验证。编写自己的表单来检查电子邮件的唯一性的解决方案是我想要避免的解决方案(第一个链接)。为什么?我认为更好的方法是更深入地添加验证。另一方面,我可以将电子邮件字段添加到 UserProfile 模型,但这会使 DB 中的信息翻倍。 sigh 但我想我会坚持表单验证方法。
猜你喜欢
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 2011-09-16
相关资源
最近更新 更多