Автогенерация имени пользователя Django с помощью django-регистрации - PullRequest
0 голосов
/ 13 августа 2011

Я пытаюсь предоставить форму регистрации пользователя, не требуя ввода имени пользователя вручную.Я настроил сервер аутентификации, чтобы пользователи могли проходить аутентификацию с помощью адреса электронной почты, и это работает, потому что я могу войти в систему с правами администратора Django.Идея состоит в том, что мое приложение будет создавать хэш SHA1 для адреса электронной почты, который будет храниться как имя пользователя Django, и пользователь никогда не увидит этого.

Я удалил поле имени пользователя из моего HTML-шаблона регистрации, но я не уверен, как или где мне следует генерировать имя пользователя программно.Я думаю, что это должно быть в методе clean_username RegistrationForm, но этот метод не вызывается, когда я использую шаблон без поля username.

Любая помощь, безусловно, будет оценена.

Ответы [ 2 ]

1 голос
/ 14 августа 2011

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

Вот как я это сделал:

  1. Создал пользовательский бэкэнд регистрации с именем RegBackend, который генерирует хэш sha1 на основе адреса электронной почты, а затем сохраняет hexdigest в качестве имени пользователя, наконец возвращая объект User.

  2. Сопоставьте регистр в urls.py с новым RegBackend, который я создал на шаге 1

  3. Изменен метод регистра просмотра django-регистрации, чтобы создать случайное имя пользователя, чтобы форма проверялась, но я никогда не сохранял случайное имя пользователя. Я скопировал словарь request.POST и установил для этого случайного имени пользователя один из ключей словаря копии, называемый data ['username']. Затем я использую переменную данных при создании экземпляра класса form_class. Вызов is_valid () в форме вернул бы false, потому что я удалил имя пользователя из шаблона, но Django требует имя пользователя для регистрации, поэтому мне нужно было указать его что-то .

Я не использовал хэш sha1 для случайного имени пользователя, потому что имя пользователя Django может быть длиной только 30 символов, а хэш sha1 равен 40. Как ни странно, пользовательский бэкэнд регистрации не жаловался и может хранить хэш sha1, но форма будет генерировать ошибки из-за длины при отправке.

_ init _. Py (я скопировал существующий DefaultBackend и изменил его частью SHA1)

from django.conf import settings
from django.contrib.sites.models import RequestSite
from django.contrib.sites.models import Site

from registration import signals
from registration.forms import RegistrationForm
from registration.models import RegistrationProfile

import hashlib

class RegBackend(object):

def register(self, request, **kwargs):

hash_user = hashlib.sha1()
hash_user.update(kwargs['email'])

    username, email, password = hash_user.hexdigest(), kwargs['email'], kwargs['password1']

    if Site._meta.installed:
        site = Site.objects.get_current()
    else:
        site = RequestSite(request)
    new_user = RegistrationProfile.objects.create_inactive_user(username, email,
                                                                password, site)
    signals.user_registered.send(sender=self.__class__,
                                 user=new_user,
                                 request=request)
    return new_user

    #omitted other code from DefaultBackend that I didn't modify

urls.py

url(r'^register/$', register, {'backend': 'registration.backends.default.RegBackend', 'form_class': UserRegistrationForm}, name='registration_register'),

registration / views.py

def register(request, backend, success_url=None, form_class=None,
             disallowed_url='registration_disallowed',
             template_name='registration/registration_form.html',
             extra_context=None):

    backend = get_backend(backend)
    if not backend.registration_allowed(request):
        return redirect(disallowed_url)
    if form_class is None:
        form_class = backend.get_form_class(request)

    if request.method == 'POST':
        # I added the next two lines
        data = request.POST.copy()
        data['username'] = ''.join([choice(letters) for i in xrange(30)])
        form = form_class(data=data, files=request.FILES)
        if form.is_valid():
            new_user = backend.register(request, **form.cleaned_data)
            if success_url is None:
                to, args, kwargs = backend.post_registration_redirect(request, new_user)
                return redirect(to, *args, **kwargs)
            else:
                return redirect(success_url)

    else:
        form = form_class()

    if extra_context is None:
        extra_context = {}
    context = RequestContext(request)
    for key, value in extra_context.items():
        context[key] = callable(value) and value() or value

    return render_to_response(template_name,
                              {'form': form},
                              context_instance=context)
0 голосов
/ 13 августа 2011

Возможно, вы думаете о создании подкласса RegistrationForm, а затем о переопределении метода clean (хотя мне это не нравится, поскольку метод clean имеет ясную цель, см. https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-clean-method)

Более простой способРешение может заключаться в том, чтобы предложить пользователю ввести свой адрес электронной почты, затем обработать эту форму, чтобы сгенерировать ваше имя пользователя, и передать это значение в представление register в качестве дополнительного контекста. Затем вместо удаления поля имени пользователя назначьте хэшированное значениеи скрыть его в своем шаблоне. Таким образом, вам не придется возиться с самой регистрацией django.

См. https://bitbucket.org/ubernostrum/django-registration/src/fad7080fe769/registration/views.py для получения дополнительной информации об аргументе extra_context.

...