设置可选用户名django用户

时间:2015-09-08 10:46:44

标签: django python-3.x

我必须将客户信息存储在Customer表中。我们无需存储他们的usernamepassword。但是为了创建客户群和用户,我使用的是django的UserGroup模型。这是客户模型,我用它来存储它的基本信息。

class Customer(models.Model):
    """
    The Customer 
    """
    UID = models.TextField(blank=True, null=True, db_index=True)
    fk_user = models.ForeignKey(User, primary_key=False)
    fk_details = models.ForeignKey(UserDetails, primary_key=False)
    fk_contact_details = models.ForeignKey(ContactDetails, primary_key=False)
    ...

这是一个创建用户对象的类方法,以后我用它来存储客户信息:

from django.contrib.auth.models import User
def create_user(self, req_dict):
    '''
    Create a new User 
    '''
    try:
        user=User.objects.create_user(**req_dict)
        user.save()
    except:
        return None
    return user

但是此代码抛出IntegrityError,这是因为我们没有在req_dict

中传递用户名
req_dict = {'first_name': u'John', 'last_name': u'Smith', 'email': u'john.smith@xyz.com'}

在创建新用户时,存储用户名可选的方式是什么?

3 个答案:

答案 0 :(得分:3)

如果您想使用django.contrib.auth,则无法将用户名字段设为可选。您总是必须在数据库中放置一个值。

为了绕过它,我建议您在create_user()中为用户名生成一个值。您可以使用随机值,也可以通过电子邮件创建用户名。只要确保它是独一无二的。

答案 1 :(得分:2)

你可以让pre_save signal只提供默认值

pre_save.connect(give_default_username, sender=User)
def give_default_username(sender, instance, *args, **kwargs):
    instance.username = 'default'

每当调用用户对象的save方法时,它将首先通过此方法附加所需的值,然后再继续使用save方法。

答案 2 :(得分:1)

我同意@zanderle最好为您的用户生成一些用户名。也许您可以使用他们的UID,电子邮件或类似的东西。

pre_save signal可以解决您的问题,但是,就我而言,它会使您的系统更加隐含,因为您的模型与您的数据库不一致。

另一种方法 - 为匿名用户创建一些默认用户。因此,每个数据库记录都有用户分配,您不会强迫客户注册。