在用户名字段中插入AUTOMATICALLY随机字符串

时间:2010-01-14 14:38:47

标签: django django-models django-forms

我希望用户名字段自动填充此值:

username = str(n);

其中n是一个数字(自动增量或随机)。

我尝试在保存方法中添加它:

username = str(random.randint(0,1000000)

但是当{2}用户n相同时存在冲突问题。

我该怎么做?

3 个答案:

答案 0 :(得分:3)

以下是生成用户名方法的修改版本,该方法允许您创建更易读的用户名,以防您将其用作任何用途的标识符。

from random import choice
from string import ascii_lowercase, digits
from django.contrib.auth.models import User

def generate_random_username(length=16, chars=ascii_lowercase+digits, split=4, delimiter='-'):

    username = ''.join([choice(chars) for i in xrange(length)])

    if split:
        username = delimiter.join([username[start:start+split] for start in range(0, len(username), split)])

    try:
        User.objects.get(username=username)
        return generate_random_username(length=length, chars=chars, split=split, delimiter=delimiter)
    except User.DoesNotExist:
        return username;

答案 1 :(得分:1)

生成它 username = str(random.randint(0,1000000) 并检查具有此名称的用户 User.objects.get(username=username) 如果你找到了某人,就会生成一个新的。

def GenerateUsername():
    username = str(random.randint(0,1000000))

    try:
        User.objects.get(username=username)
        return GenerateUsername()
    except User.DoesNotExist:
        return username;

答案 2 :(得分:1)

根据Antony Hatchkins的评论我最近实施了一个类似的算法,我想发布反馈意见,在没有保护的情况下使用失败保护而不是递归:

def GenerateUsername():
    i = 0
    MAX = 1000000
    while(i < MAX):
        username = str(random.randint(0,MAX))
        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            return username
        i+=1
    raise Exception('All random username are taken')