Django регистрация, имя и фамилия, без имени пользователя - PullRequest
1 голос
/ 10 мая 2011

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

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

Вам нужно определить свой собственный AUTHENTICATION_BACKEND и объявить его в settings.py: то есть:

AUTHENTICATION_BACKENDS = (
    'yourapp.backends.NoUsernameModelBackend',
)

Код должен выглядеть так:

class NoUsernameModelBackend
    def authenticate(self, first_name=None,last_name, password=None):
        try:
            user = User.objects.get(first_name=first_name,last_name=last_name)
            if user.check_password(password):
            return user
        except User.DoesNotExist:        
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

Затем вам нужно определить свою собственную AuthenticationForm, чтобы вместо имени пользователя брать имя_символа и фамилию и соответственно определять шаблон URL.

в URL:

(r'^login/?$','django.contrib.auth.views.login', {'authentication_form':'FullNameAuthenticationForm'}, 'login'),
2 голосов
/ 10 мая 2011

Для аутентификации Django (и с расширением admin) требуется имя пользователя - полная остановка.Поэтому вам придется приложить некоторые усилия, чтобы обойти это.

У вас есть несколько вопросов для рассмотрения: 1) Имя Фамилия быстро приведет к коллизиям.Что делает ваш сервис, когда второй «Джон Смит» хочет зарегистрироваться?

2) Вам нужно создать имя пользователя, так что вы, вероятно, будете использовать хэш firstname_lastname.Опять же, что вы делаете, когда получаете второе точное совпадение?

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

Можно найти прототип решения # 2 здесь - в основном при обработке формы генерируется случайный уникальный хеш.

while True:
    self.cleaned_data['username'] = str(md5(str(self.data['email']) + str(random.random())).hexdigest())[0:30]
    try:
        user = User.objects.get(username__iexact=self.cleaned_data['username'])
    except User.DoesNotExist:
        break
...