2017-07-12 2 views
0

UserCreationFormを変更して、ユーザが自分のサイトにサインアップすることを要求したときにlast_name + '。' + first_nameのユーザ名が与えられるようにしたい。Django UserCreationFormをカスタマイズして、ユーザが入力するのではなく、lastnameとfirstnameからユーザ名を作成しますか?

私のDjangoのforms.pyは:

<h2>Sign up</h2> 
<form method="post"> 
{% csrf_token %} 
{% for field in form %} 
    <p> 
    {{ field.label_tag }}<br> 
    {{ field }} 
    {% if field.help_text %} 
     <small style="color: grey">{{ field.help_text }}</small> 
    {% endif %} 
    {% for error in field.errors %} 
     <p style="color: red">{{ error }}</p> 
    {% endfor %} 
    </p> 
{% endfor %} 
<button type="submit">Sign up</button> 
</form> 

、私のviews.py中:

from django import forms 
from django.contrib.auth.forms import UserCreationForm 
from django.contrib.auth.models import User 


class SignUpForm(UserCreationForm): 
    first_name = forms.CharField(max_length=30, required=False) 
    last_name = forms.CharField(max_length=30, required=False) 
    email = forms.EmailField(max_length=254) 


    class Meta: 
     model = User 
     fields = ('first_name', 'last_name', 'email', 'password1', 'password2',) 
     exclude = ['username', ] 

だから私は、実際のフォームからユーザー名を除外した

def signup(request): 
    if request.method == 'POST': 

     form = SignUpForm(request.POST) 

私はここにform.save()を入れてみて、cleaned_data first_name.last_name = usernameを取得しようとしましたが、 UserモデルUSERNAME_FIELD属性は、フォームフィールドに存在する場合は、username属性を除外したくないので、あなたがする別のフィールドを選択した場合を除き、それはデフォルトで初期化チェックのUserCreationForm

 if form.is_valid(): 
      form.save() 

      first_name = form.cleaned_data.get('first_name') 
      last_name = form.cleaned_data.get('last_name') 
      raw_password = form.cleaned_data.get('password1') 
      #username = form.cleaned_data.get('username') 
      username = firstname+'.'+lastname 

      user = authenticate(username=username, password=raw_password) 

      user.is_active = False 

      user.save() 
      return render(request, 'registration/signedup.html', {'user': user}) 

     else: 
      return render(request, 'registration/signup.html', {'form': form, 'invalid': 'Please try again.'}) 

    else: 
     form = SignUpForm() 
     return render(request, 'registration/signup.html', {'form': form}) 
+0

エラーが発生していますか? –

+0

私のユーザ名はノンタイプです: username = form.cleaned_data.get( 'username') – trouselife

+0

form.cleaned_dataを取得するには、form.save()を実行する必要がありますが、ユーザー名はNoneです。何とかform_save()を編集する必要がありますが、何をすべきかわかりません。 – trouselife

答えて

0

を動作しません。あなたのUSERNAME_FIELD

あなたはUSERNAME_FIELDとしてユーザ名を使用したいが、あなたのHTMLに隠されたとして、あなたはその後、上書きすることができ{{ form.username.as_hidden }}

のようなテンプレート構文を使用して設定することができ、それはフロントエンドに示したくない場合saveメソッドをSignUpFormにすると、フォームが有効になったら後処理を行うことができます。

継承されているため、フィールドにpassword1password2を追加する必要もありません。

あなたは2の合計値になるようにusername属性を設定することを予定している場合、ユーザーは自分のFIRST_NAMEを入力しないとき、そうでない場合、私は以下に提供したコードは動作しません必要とされることがfirst_namelast_nameを設定する必要がありますとlast_name。

class SignUpForm(UserCreationForm): 
    first_name = forms.CharField(max_length=30, required=False) 
    last_name = forms.CharField(max_length=30, required=False) 
    email = forms.EmailField(max_length=254) 


    class Meta: 
     model = User 
     fields = ('email', 'username', 'first_name', 'last_name') 

    def save(self, commit=True): 
     user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     user.username = '{}.{}'.format(
      self.cleaned_data['last_name'], 
      self.cleaned_data['first_name'] 
     ) 
     if commit: 
      user.save() 
     return user 
関連する問題