【问题标题】:Insert AUTOMATICALLY random string in username field在用户名字段中插入自动随机字符串
【发布时间】:2010-01-14 14:38:47
【问题描述】:

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

username = str(n);

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

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

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

但是当n 对两个用户相同时会出现冲突问题。

我该怎么做?

【问题讨论】:

  • 你可以发出一个保存后的信号并在其中填写来自pk的用户名
  • 或者你可以把 username 变成一个等于 self.pk 的属性

标签: django django-models django-forms


【解决方案1】:

这是生成用户名方法的修改版本,它允许您创建更多人类可读的用户名,以防万一您出于任何目的将其用作标识符。

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 如果长度减少到 4 或 5,这是一个非常好的解决方案;-)
【解决方案2】:

生成它 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;

【讨论】:

  • 会导致1000000个用户的栈溢出
  • 确实如此。我没有说它是完美的,我只是回答了他的问题:)
  • 我没有说你错了,我只是说在这种特殊情况下普通循环会减少内存消耗:)
【解决方案3】:

基于 Antony Hatchkins cmets 我最近实现了一个类似的算法,我想我会发布反馈,循环使用失败保护而不是递归而不是保护:

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

【讨论】:

  • 你没有增加i
猜你喜欢
  • 2019-09-08
  • 2015-12-22
  • 1970-01-01
  • 2020-12-18
  • 2016-02-07
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多