0

ユーザー名を手動で入力せずに、ユーザー登録フォームを提供しようとしています。ユーザーがメールアドレスで認証できるように認証バックエンドを設定しました。これは、Django管理者ユーザーでログインできるため機能します。私のアプリは、Djangoユーザー名として保存されるメールアドレスのSHA1ハッシュを作成し、ユーザーにはこれが表示されないという考え方です。

登録HTMLテンプレートからユーザー名フィールドを削除しましたが、プログラムでユーザー名を生成する方法と場所がわかりません。RegistrationFormのclean_usernameメソッドに含める必要があると思いますが、usernameフィールドのないテンプレートを使用すると、そのメソッドは呼び出されません。

どんな助けでも確かにありがたいです。

4

2 に答える 2

1

私はそれを機能させました。登録のviewメソッドとデフォルトの登録バックエンドを直接変更する必要があるのは気が進まない。私は自分のコードにこれらの変更を加えたいと思っており、それらの変更を行うためにまだ取り組んでいますが、これは確かに機能します。

これが私がそれをした方法です:

  1. メールアドレスに基づいてsha1ハッシュを生成し、ユーザー名としてhexdigestを保存して、最終的にUserオブジェクトを返すRegBackendというカスタム登録バックエンドを作成しました。

  2. urls.pyのレジスタをステップ1で作成した新しいRegBackendにマップします

  3. フォームが検証されるように、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)
于 2011-08-14T00:21:33.547 に答える
0

RegistrationFormサブクラス化してからメソッドをオーバーライドすることを考えているかもしれませんclean(ただし、cleanメソッドには明確な目的があるため、https://docs.djangoproject.com/en/dev/topics/forms/modelforms/を参照してください。 #overriding-the-clean-method

より簡単な解決策は、ユーザーに電子メールアドレスの入力を求め、そのフォームを処理してユーザー名を生成し、その値をregister追加のコンテキストとしてビューに渡すことです。次に、ユーザー名フィールドを削除する代わりに、ハッシュ値を割り当てて、テンプレートで非表示にします。そうすれば、django-registration自体をいじくり回す必要がなくなります。

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

于 2011-08-13T01:06:54.170 に答える