2011-08-12 22 views
0

ユーザー名を手動で入力せずにユーザー登録フォームを提供しようとしています。私は、認証バックエンドをセットアップして、ユーザーが電子メールアドレスで認証できるようにしました。これは、Django管理者のユーザーでログインできるためです。アイデアは、私のアプリケーションはDjangoのユーザー名として保存される電子メールアドレスのSHA1ハッシュを作成し、ユーザーはこれを決して見ないだろうということです。djangoの登録でDjangoのユーザー名を自動生成する

私は登録htmlテンプレートからユーザー名フィールドを削除しましたが、私はどのようにしてユーザー名をプログラムで生成するべきかわかりません。私はそれがRegistrationFormのclean_usernameメソッドにあるべきだと思うが、ユーザ名フィールドなしでテンプレートを使うとそのメソッドは呼び出されない。

ご協力いただければ幸いです。

+0

ユーザー名を作成しますあなたはビューでフォームの検証を行っていますか? –

+0

私はビューを書いていないので、私はdjango登録ビューを変更する必要があります。私はどのようにユーザー名を設定するだろう。私は電子メールのハッシュを生成することはできますが、ハッシュを使って何をするのかはわかりません。 – Raj

+0

1つの可能な方法は、Django登録で何もしないで、テンプレートのユーザー名フィールドを隠すだけです。ユーザーがフォームを呼び出す前にjavascript関数を送信してユーザー名を生成し、ポストに値を設定すると、電子メールの左側の部分を取って変更することです。 –

答えて

1

私はそれを動作させました。私は、登録のビューメソッドとデフォルトの登録バックエンドを直接変更する必要はないと感じています。私は自分のコードでこれらの変更を行いたいと思っていますが、変更を加えるためにまだ取り組んでいますが、これは実際には機能します。

は、ここで私はそれをやった方法は次のとおりです。

  1. 最後にUserオブジェクトを返す、ユーザ名としてhexdigestを格納し、その後、電子メールアドレスに基づいて、SHA1ハッシュを生成し、カスタム登録バックエンドと呼ばれるRegBackendを作成しました。私はステップで作成した新しいRegBackendにurls.pyで

  2. 地図レジスタ1

  3. フォームが検証されるように、ランダムなユーザ名を作成するように変更ジャンゴ登録のビューregisterメソッドが、私は持続したことがありませんランダムなユーザー名。私はrequest.POST辞書をコピーし、このランダムなユーザ名をdata ['username']と呼ばれるコピーの辞書キーに設定しました。次に、form_classのインスタンスを作成するときにdata変数を使用します。テンプレートからユーザー名を削除したため、フォーム上でis_valid()を呼び出すとfalseが返されますが、Djangoにはユーザー名が必要ですので、何かを入力する必要がありました。 sha1ハッシュは40奇妙なことに、カスタム登録バックエンドは文句を言わなかったし、保存することができている間Djangoのユーザ名は長さだけで30文字にすることができますので、私は、ランダムなユーザ名のSHA1ハッシュを使用していませんでした

sha1ハッシュですが、フォームは送信されたときの長さのためにエラーを生成します。

_ _です。PY(I既存の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) 
0

あなたはサブクラス化RegistrationFormのことを考え、その後clean方法

は簡単な解決策を求めるようになるかもしれません(私はクリーンな方法は、明確な目的を持っているので、https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-clean-methodを参照してください、しかしそれを好きではないが)オーバーライドされる可能性がありますユーザーは自分のメールアドレスを入力し、そのフォームを処理してユーザー名を生成し、その値を余分なコンテキストとしてregisterビューに渡します。次に、ユーザー名フィールドを削除する代わりに、ハッシュ値を割り当ててテンプレートで非表示にします。そうすれば、あなたはジャンゴ登録自体を混乱させる必要はありません。

extra_context引数の詳細については、https://bitbucket.org/ubernostrum/django-registration/src/fad7080fe769/registration/views.pyを参照してください。