Я получил его на работу. Я не чувствую себя хорошо из-за необходимости напрямую изменять метод просмотра регистрации и бэкэнд регистрации по умолчанию. Я бы предпочел, чтобы эти изменения были в моем собственном коде, и я все еще работаю над тем, чтобы внести эти изменения, но это действительно работает.
Вот как я это сделал:
Создал пользовательский бэкэнд регистрации с именем RegBackend, который генерирует хэш sha1 на основе адреса электронной почты, а затем сохраняет hexdigest в качестве имени пользователя, наконец возвращая объект User.
Сопоставьте регистр в urls.py с новым RegBackend, который я создал на шаге 1
Изменен метод регистра просмотра 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)