【发布时间】:2016-01-12 16:16:17
【问题描述】:
所以,我有这两个模型:
class User(AbstractBaseUser):
"""
Custom user class
"""
email = models.EmailField(verbose_name = 'email address', unique = True, db_index = True)
joined = models.DateTimeField(auto_now_add = True)
is_active = models.BooleanField(default = True)
is_admin = models.BooleanField(default = False)
user_type = models.CharField(max_length = 30)
group = models.ManyToManyField(Group, related_name = 'users')
permission = models.ManyToManyField(Permission, related_name = 'users')
USERNAME_FIELD = 'email' # Mapping between our model's email field to Django's User model's username
和
class Subscription(models.Model):
project_name = models.CharField(max_length = 40) # A subscription can only be for one project (one to one), e.g. you cannot buy a subscription for two projects. You have to buy two different subscriptions
user = models.ManyToManyField(User, related_name = 'subscriptions', blank = True) # One user can have many different subscriptions (e.g. for different projects), and one subscription is good for many users
date = models.DateTimeField(auto_now_add = True) # Keeping track of when a subscription is entered
mop = models.CharField(max_length = 20, choices = PAYMENT_CHOICES)
payment_term = models.CharField(max_length = 30, choices = PAYMENT_TERMS)
package = models.CharField(max_length = 50, choices = PACKAGES)
因此,用户和订阅之间存在多对多关系,例如一个用户可以有多个订阅,一个订阅对多个用户都有好处。
当用户注册时,它应该允许用户使用相同的电子邮件地址注册不同的项目。但是,它不会这样做,因为设置了 unique=True。我尝试删除 unique=True,但显然它抱怨 Django 需要 USERNAME = 'email' 的唯一字段。
理想情况下,我希望在电子邮件(用户模型)和项目(订阅模型)上都具有 unique=True,例如虽然一个用户不能多次注册一个项目,但一个用户可以拥有多个项目。我怎么做?似乎 project_name 字段属于订阅模型而不属于用户模型,因为如果它在用户模型中,由于多对多关系,这意味着订阅可以有许多不正确的项目(即订阅总是针对一个项目)。
一方面,我希望登录页面允许用户仅使用他们的电子邮件地址登录(因此我需要在电子邮件上使用 unique=True 才能登录)。另一方面,我希望注册允许在不同项目中注册相同的电子邮件,而不是抱怨该电子邮件已经存在(因此,我不需要 unique=True 在电子邮件上进行注册)。
有什么想法吗?
【问题讨论】:
-
如果您也将 unique=True 放在 project_name 上,它应该可以工作。如果它不起作用,则错误可能在添加订阅的代码中。您可以将该代码添加到您的问题中吗?
-
@FrederikVds,我确实尝试了您的解决方案,它给了我并且表单重新加载,抱怨“使用此电子邮件地址的用户已经存在”。显然,当电子邮件仍然是唯一的时,您不能再次注册相同的电子邮件地址。为 project_name 添加 unique = True 只会强制 project_name 的唯一性,但不会接受重复的电子邮件。
-
是的,但是生成此错误的表单代码是什么?您的模型看起来不错,但您不应尝试在表单中创建新用户,而应尝试查找现有用户并仅添加新订阅。
标签: django django-models django-registration django-users