私はこれを読んだことがあります
http://docs.b-list.org/django-registration/0.8/backend-api.html
そして、私は自分のバックエンドを作ることに挑戦しました。登録に同じ電子メールを使用することを禁止するバックエンドを作成し、電子メール エラー メッセージを変更したいので、これを行っています。私も自分のフィールドに追加したかったです!
これが私が思いついたものです:
from django import forms
from registration.forms import RegistrationForm
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User
from registration.forms import attrs_dict
class customRegistrationForm(RegistrationForm):
email2 = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict,
maxlength=75)),
label=_("Confirm email"))
def clean_email(self):
"""
Validate that the email is alphanumeric and is not already
in use.
"""
try:
email = User.objects.get(email__iexact=self.cleaned_data['email'])
except User.DoesNotExist:
return self.cleaned_data['email']
raise forms.ValidationError(_("That email already exists - if you have forgotten your password, go to the login screen and then select \"forgot password\""))
def clean(self):
"""
Verifiy that the values entered into the two email fields
match. Note that an error here will end up in
``non_field_errors()`` because it doesn't apply to a single
field.
"""
if 'email' in self.cleaned_data and 'email2' in self.cleaned_data:
if self.cleaned_data['email'] != self.cleaned_data['email2']:
raise forms.ValidationError(_("The two email fields didn't match."))
return super(RegistrationForm,clean)
上記は私のinit .pyファイルに入ります(それが何であれ)
次に、urls.py コードに次のように記述します。
url(r'^accounts/register/$',
register,
{ 'backend': 'myapp.forms.customRegistrationForm' },
name='registration_register'),
... #other urls here!
/accounts/register ページに移動すると、次のエラーが表示されます。
/accounts/register/ の AttributeError
「customRegistrationForm」オブジェクトには属性「registration_allowed」がありません
これは奇妙です。サブクラスに「registration_allowed」メソッドを追加する必要があると言っているようです。しかし、サブクラスはRegistrationFormのサブクラスであり、正常に動作し、そのようなものが定義されていません...これらのメンバーを追加できることはわかっていますが、拡張の目的に勝っているようですよね?
アップデート
動作するようになったコードは次のとおりです。
さまざまなクラスをさまざまなフォルダーのさまざまなinit .py ファイルに分割しました。1 つは "forms" と呼ばれ、もう 1 つは "backends" と呼ばれ、どちらもメイン プロジェクトの下のフォルダー "djangoRegistration" にあります。
/フォーム/ init .py
from django import forms
from registration.forms import RegistrationForm
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User
from registration.forms import attrs_dict
class customRegistrationForm(RegistrationForm):
def __init__(self, *args, **kw):
super(RegistrationForm, self).__init__(*args, **kw)
self.fields.keyOrder = [
'username',
'email',
'email2',
'password1',
'password2'
]
email2 = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict,
maxlength=75)),
label=_("Confirm email"))
def clean_email(self):
"""
Validate that the email is alphanumeric and is not already
in use.
"""
try:
email = User.objects.get(email__iexact=self.cleaned_data['email'])
except User.DoesNotExist:
return self.cleaned_data['email']
raise forms.ValidationError(_("That email already exists - if you have forgotten your password, go to the login screen and then select \"forgot password\""))
def clean(self):
"""
Verifiy that the values entered into the two email fields
match. Note that an error here will end up in
``non_field_errors()`` because it doesn't apply to a single
field.
"""
if 'email' in self.cleaned_data and 'email2' in self.cleaned_data:
if self.cleaned_data['email'] != self.cleaned_data['email2']:
raise forms.ValidationError(_("The two email fields didn't match."))
return super(RegistrationForm,clean)
/バックエンド/ init .py
from registration.backends.default import DefaultBackend
from dumpstownapp.djangoRegistration.forms import customRegistrationForm
class customDefaultBackend(DefaultBackend):
def get_form_class(self, request):
"""
Return the default form class used for user registration.
"""
return customRegistrationForm
そして最後に、私の urls.py は新しいバックエンドを参照するだけです:
url(r'^accounts/register/$',
register,
{ 'backend': 'myapp.djangoRegistration.backends.customDefaultBackend' },
name='registration_register'),
#more urls here! yay!
最後に、フィールドの表示方法を「順序付け」するコードを追加する必要がありました。これは、customRegistrationFormのinitメソッドが行っていることです。
ありがとう!