2011-09-23 19 views
7

ユーザー登録ページに電子メールとパスワードのフィールドを表示し、ユーザー名を表示しないようにします。 私は、この登録フォームを作成しました:DjangoのUserCreationFormからUsernameフィールドを削除する方法

class RegisterForm(UserCreationForm): 
    email = forms.EmailField(label = "Email") 
    #fullname = forms.CharField(label = "First name") 

    class Meta: 
     model = User 
     fields = ("email",) 

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

しかし、ユーザ名はまだ表示されます。私は別のものを無効にする必要がありますか?

それを見つけた
class RegisterForm(UserCreationForm): 
    email = forms.EmailField(label = "Email") 
    #fullname = forms.CharField(label = "First name") 

    class Meta: 
     model = User 
     exclude = ['username',] 
+0

私はusernameフィールドは 'UserCreationForm'から来ていると思うので、そこから除外してください! – Ahsan

答えて

0

はメタクラスの除外にそのフィールドを追加します。これは私がやってみたかったまさにです: http://www.micahcarrick.com/django-email-authentication.html

+0

それは本当に助けにはなりませんでした。だから違うバリエーションを試してみましたが、それは私にとってはうまくいきませんでした。 – ArmenB

1

+1

リンクがありません – acquayefrank

+0

あなたのためのインターネットです。私はここにウェブサイトの内容を貼り付けるべきだった。今私はもはやdjangoで動作しません。申し訳ありません。 – ArmenB

5

あなたがそうのようなフォームのフィールドからユーザー名を飛び出すことができます。

class RegisterForm(UserCreationForm): 

    def __init__(self, *args, **kwargs): 
     super(RegisterForm, self).__init__(*args, **kwargs) 
     # remove username 
     self.fields.pop('username') 
    ... 

しかし、その後、あなたは次のように保存する前に埋める-にするために、いくつかのランダムなユーザ名必要がありますそう:

from random import choice 
from string import letters 
... 

class RegisterForm(UserCreationForm): 
... 
    def save(self): 
     random = ''.join([choice(letters) for i in xrange(30)]) 
     self.instance.username = random 
     return super(RegisterForm, self).save() 

ユーザー名を引っ張るだろうとあなたのLoginFormを作るように、それをこのようにハックするとき、後でそれが必要とされるときに取るために他の考慮事項があります。

class LoginForm(AuthenticationForm): 

    email = forms.EmailField(label=_("E-mail"), max_length=75) 

    def __init__(self, *args, **kwargs): 
     super(LoginForm, self).__init__(*args, **kwargs) 
     self.fields['email'].required = True 
     # remove username 
     self.fields.pop('username') 

    def clean(self): 
     user = User.objects.get(email=self.cleaned_data.get('email')) 
     self.cleaned_data['username'] = user.username 
     return super(LoginForm, self).clean() 
+1

申し訳ありませんが、電子メールフィールドを持つLoginFormは、最初にパスワードを表示してから電子メールを表示します。 self.fields.keyOrder = ['email'、 'password'、]これを修正するには、これを__init__の中に入れてください。 –

関連する問題