Вставить АВТОМАТИЧЕСКИ случайную строку в поле имени пользователя - PullRequest
0 голосов
/ 14 января 2010

Я хочу, чтобы поле имени пользователя автоматически заполнялось этим значением:

username = str(n);

, где n - число (автоинкрементное или случайное).

Я пытался добавить это в методе сохранения:

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

но существует проблема столкновения, когда n одинаково для 2 пользователей.

Как мне это сделать?

Ответы [ 3 ]

3 голосов
/ 04 июня 2012

Вот модифицированная версия метода создания имени пользователя, которая позволяет вам создавать более удобочитаемые имена пользователей на тот случай, если вы используете его в качестве идентификатора для любых целей.

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 голос
/ 10 июля 2011

Основываясь на комментариях Энтони Хэтчкинса, я недавно реализовал похожий алгоритм, полагая, что буду публиковать для обратной связи, зацикленный с защитой от сбоев вместо рекурсивного без защиты:

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')
1 голос
/ 14 января 2010

Создайте это 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...