私はそれを機能させました。登録のviewメソッドとデフォルトの登録バックエンドを直接変更する必要があるのは気が進まない。私は自分のコードにこれらの変更を加えたいと思っており、それらの変更を行うためにまだ取り組んでいますが、これは確かに機能します。
これが私がそれをした方法です:
メールアドレスに基づいてsha1ハッシュを生成し、ユーザー名としてhexdigestを保存して、最終的にUserオブジェクトを返すRegBackendというカスタム登録バックエンドを作成しました。
urls.pyのレジスタをステップ1で作成した新しいRegBackendにマップします
フォームが検証されるように、django-registrationのview registerメソッドを変更してランダムなユーザー名を作成しましたが、ランダムなユーザー名を永続化することはありません。request.POSTディクショナリをコピーし、このランダムなユーザー名をコピーのディクショナリキーの1つであるdata['username']に設定しました。次に、form_classのインスタンスを作成するときにデータ変数を使用します。テンプレートからユーザー名を削除したため、フォームでis_valid()を呼び出すとfalseが返されますが、Djangoは登録にユーザー名が必要なので、何かを指定する必要がありました。
ランダムなユーザー名にsha1ハッシュを使用しなかったのは、sha1ハッシュが40であるのに対し、Djangoユーザー名の長さは30文字しかないためです。奇妙なことに、カスタム登録バックエンドは文句を言わず、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'),
登録/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)