2013-05-15 6 views
9

私はDjango 1.5 Python 3.2.3を使用しています。Django 1.5:UserCreationFormとカスタム認証モデル

ユーザー名の代わりに電子メールアドレスを使用するカスタム認証セットアップがあります。 はありません。モデルには全く定義されていないユーザ名があります。それはうまく動作します。それでも、ユーザー作成フォームを作成すると、ユーザー名フィールドに追加されます。だから、どのフィールドを表示したいかを正確に定義しようとしましたが、それでもフォームにユーザー名フィールドが残っています。さらに、カスタム認証モデルにも存在しません。どうすればそれをやめさせることができますか?このため

私のフォームはそうのように定義されています。ドキュメントで

class UserCreateForm(UserCreationForm): 

    class Meta: 
     model = MyUsr 
     fields = ('email','fname','surname','password1','password2', 
        'activation_code','is_active') 

Custom Users and Builtin Formsは、「任意のカスタム・ユーザー・モデルのために再作成する必要があります。」と言います私はそれが私がここでやっていることだと思います。どちらも、これまたUserCreationForm documentationはこれについて何も言わない。だから私は何が欠けているのか分からない。私はGoogle経由で何も見つけられませんでした。

答えて

4

sctratchからフォームを作成する必要があります。これは、UserCreationFormを拡張してはいけません。 UserCreationFormには、明示的に定義されたusernameフィールドとその他のフィールドがあります。あなたはそれを見ることができますhere

+2

おっと、Djangoに関するすべての良い点について、これは狂った悪いビットです。ユーザー名なしでカスタム認証を行うことができますが、UserCreationFormが破損します。ありがとう。少なくとも、私が得ている結果を得るには何か間違っていないことを知っています。 – Zamphatta

+1

しかし、書類はこの書式を書き直すべきだと言います。書き直しても意味がありません。新しいものを意味します。 – Aldarund

13

あなたUserCreationForm

# forms.py 
from .models import CustomUser 

class UserCreationForm(forms.ModelForm): 
    password1 = forms.CharField(label="Password", widget=forms.PasswordInput) 
    password2 = forms.CharField(label="Password confirmation", widget=forms.PasswordInput) 

    class Meta: 
     model = CustomUserModel 
     # Note - include all *required* CustomUser fields here, 
     # but don't need to include password1 and password2 as they are 
     # already included since they are defined above. 
     fields = ("email",) 

    def clean_password2(self): 
     # Check that the two password entries match 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      msg = "Passwords don't match" 
      raise forms.ValidationError("Password mismatch") 
     return password2 

    def save(self, commit=True): 
     user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 

ようになるはずます。また、パスワードフィールドをoverrwriteませんユーザー変更フォームを、お勧めします:

class UserChangeForm(forms.ModelForm): 
    password = ReadOnlyPasswordHashField() 

    class Meta: 
     model = CustomUser 

    def clean_password(self): 
     # always return the initial value 
     return self.initial['password'] 

はこのようにあなたの管理者にこれらの定義:

#admin.py 

from .forms import UserChangeForm, UserAddForm 

class CustomUserAdmin(UserAdmin): 
    add_form = UserCreationForm 
    form = UserChangeForm 

また、list_display,を上書きする必要があります(django.contrib.auth.admin.UserAdminに記載されているものはすべてusernameであると思いますが、私はそれをすべて列挙したと思います)。

+0

保存方法のTwoScoopsは面白そうです:) –

+0

このTwoScoopsUserCreationFormはどこにありますか? – DerShodan

+0

すばらしい答え!それは私に多くの助け、感謝:) – Emilcasvi