33

django-registrationを使用した認証にユーザー名の代わりに電子メールを使用するにはどうすればよいですか。

さらに、登録モジュールを既にインストールしたら、この変更を強制するにはどうすればよいですか。

ここでソリューションを編集しますか django-registration で電子メールをユーザー名として使用するための良いハックを知っている人はいますか? libフォルダーに?

4

3 に答える 3

33

親愛なる仲間のDjangoCoder、

これが最善の方法だと思います。幸運を!

最初のステップは、使用するフォームを作成することです

プロジェクト/アカウント/forms.py

from django import forms
from registration.forms import RegistrationForm
from django.contrib.auth.models import User

class Email(forms.EmailField): 
    def clean(self, value):
        super(Email, self).clean(value)
        try:
            User.objects.get(email=value)
            raise forms.ValidationError("This email is already registered. Use the 'forgot password' link on the login page")
        except User.DoesNotExist:
            return value


class UserRegistrationForm(forms.Form):
    password1 = forms.CharField(widget=forms.PasswordInput(), label="Password")
    password2 = forms.CharField(widget=forms.PasswordInput(), label="Repeat your password")
    #email will be become username
    email = Email()

    def clean_password(self):
        if self.data['password1'] != self.data['password2']:
            raise forms.ValidationError('Passwords are not the same')
        return self.data['password1']

ここでは、django-registrationのregister()関数をオーバーライドするファイルを作成しています。

プロジェクト/アカウント/regbackend.py

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

from registration.backends import default


class Backend(default.DefaultBackend):
    def register(self, request, **kwargs):
        email, password = kwargs['email'], kwargs['password1']
        username = email
        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

使用するパスにURLを送信します。

project / urls.py

(r'^accounts/', include('registration.backends.default.urls')),

登録ビューにカスタムバックエンドを使用するようにURLに指示します。また、作成したフォームをインポートして、ビューで処理するURLに追加します。

プロジェクト/アカウント/urls.py

from django.conf.urls.defaults import *
from registration.backends.default.urls import *
from accounts.forms import UserRegistrationForm

urlpatterns += patterns('',

    #customize user registration form
    url(r'^register/$', 'registration.views.register',
        {
            'backend': 'accounts.regbackend.Backend',
            'form_class' : UserRegistrationForm
        },
        name='registration_register'
    ),

) 

それがうまくいくことを願っています!

-マット

于 2011-06-17T00:42:58.207 に答える
6

Django >= 1.3 および < 1.5 の場合、githubのユーザー名として Django 電子メールがあります。

最近、私は登録を使用しており、簡単にdjango-registration-emailに切り替えています。同じテンプレートを再利用し、プロファイル作成ページREGISTRATION_EMAIL_ACTIVATE_SUCCESS_URL = "/profiles/create/"へのリダイレクトを追加するだけで、Django 1.4 でも問題なく動作します。

Django 1.5では、どのフィールドを username として使用するかを指定できるカスタム User モデルによって、この問題を解決しています。Django 1.5 のドキュメントに記載されているとおり:

一意の識別子として使用される User モデルのフィールドの名前を説明する文字列。これは通常、何らかのユーザー名になりますが、電子メール アドレスやその他の一意の識別子にすることもできます。

于 2012-10-20T16:32:19.690 に答える