Django-registration を使用した認証に、ユーザー名の代わりにメールを使用するにはどうすればよいですか。
さらに、登録モジュールをインストールした後、この変更を強制するにはどうすればよいですか。
ここでソリューションを編集しますか Django-registrationが電子メールをユーザー名として使用するための良いハックを知っている人はいますか? libフォルダー内?
親愛なる仲間Djangoコーダー、
これが最善の方法だと思います。幸運を!
最初のステップは、使用したいフォームを作成することです。
プロジェクト/アカウント/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'
),
)
それがうまくいくことを願っています!
-マット
最も簡単な方法は、CSS display:noneプロパティを使用してregistration_formテンプレートのsernameフィールドを非表示にすることです。そして、emailフォームフィールドから値を取得し、非表示のsernameフィールドに値を設定するスクリプトを追加します。そのため、フォームを送信するときに、ユーザーは知らないうちにユーザー名としてメールを送信します。唯一の問題は、デフォルトでは、ユーザー名フィールドが30文字を超える電子メールを受け入れることができないためです。したがって、安全に賭けるために、データベースでユーザー名の長さを手動で増やす必要があります。
新しいregistration_form.htmlテンプレートは次のとおりです。
<form method="post" action="" class="wide">
{% csrf_token %}
<dl>
<div style="display:none">
<dt>
<label for="id_username">Username:</label>
{% if form.username.errors %}
<span class="error">{{ form.username.errors.as_text }}</span>
{% endif %}
</dt>
<dd>{{ form.username }}</dd>
</div>
<dt>
<label for="id_email">Email address:</label>
{% if form.email.errors %}
<span class="error">{{ form.email.errors.as_text }}</span>
{% endif %}
</dt>
<dd>{{ form.email }}</dd>
<br>
<dt>
<label for="id_password1">Password:</label>
{% if form.password1.errors %}
<span class="error">{{ form.password1.errors.as_text }}</span>
{% endif %}
</dt>
<dd>{{ form.password1 }}</dd>
<br>
<dt>
<label for="id_password2">Password (type again to catch typos):</label>
{% if form.password2.errors %}
<span class="error">{{ form.password2.errors.as_text }}</span>
{% endif %}
</dt>
<dd>{{ form.password2 }}</dd>
<br>
<dt><input type="submit" value="Sign up" /></dt>
</dl>
</form>
非表示のフォームフィールドに値を設定する単純なjQuerysrcipt sernameは次のとおりです。
$(document).ready(function()
{
$('#id_email').blur(function(e)
{
var email_address = $('#id_email').val();
$('#id_username').val(email_address);
});
});
ID id_emailおよびid_usernameは、Django-registrationフォームによって自動的に設定されます。
Django> = 1.3および<1.5の場合、githubに ユーザー名としてのDjangoメール があります。
最近、登録を使用していて、簡単に Django-registration-email に切り替えています。 Django 1.4で正常に動作し、同じテンプレートを再利用し、REGISTRATION_EMAIL_ACTIVATE_SUCCESS_URL = "/profiles/create/"
を追加して profile 作成ページにリダイレクトします。
Django 1.5は、カスタムユーザーモデルを通じてこの問題を克服します。ここで ユーザー名として使用するフィールドを指定できます 。 Django 1.5ドキュメントに記載されているように:
一意の識別子として使用されるユーザーモデルのフィールドの名前を説明する文字列。これは通常、ある種のユーザー名になりますが、電子メールアドレスやその他の一意の識別子にすることもできます。