0

私は最初にユーザー名とパスワードを使用してログインしていましたが、既存のユーザーとコンテンツを削除することなく、同じサイトの電子メールアドレス認証に変更したいと考えています。 私は私のファイルに以下の変更をしたが、エラー 'UNIQUE制約が失敗しました:auth_user.username' を取得すでにプロジェクトに登録されているユーザ認証を電子メール認証に変更するにはどうすればよいですか?

forms.py

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


class UserForm(forms.ModelForm): 
    password = forms.CharField(widget=forms.PasswordInput) 

    class Meta: 
     model = User 
     fields = ['first_name', 'last_name', 'email', 'password'] 

views.py

class UserFormView(View): 

    form_class = UserForm 
    template_name = 'main/registration_form.html' 

    def get(self, request): 
     form = self.form_class(None) 
     return render(request, self.template_name, {'form': form}) 

    def post(self, request): 
     form = self.form_class(request.POST) 

     if form.is_valid(): 

      user = form.save(commit=False) 

      # cleaned (normalized) data 
      email = form.cleaned_data['email'] 
      password = form.cleaned_data['password'] 
      user.set_password(password) 
      user.save() 

      # return user objects if credentials are correct 
      user = authenticate(email=email, password=password) 

      if user is not None: 

       if user.is_active: 
        login(request, user) 
        # request.user.username  display their username 
        return redirect('main:register2') 
     return render(request, self.template_name, {'form': form}) 

class LoginForm(View): 

    form_class = UserForm 
    template_name = 'main/login_form.html' 

    def get(self, request): 
     form = self.form_class(None) 
     if error: 
      return render(request, self.template_name, {'form': form}, 
{'error': error}) 
     else: 
      return render(request, self.template_name, {'form': form}) 

    def post(self, request): 
     email = request.POST.get('email', '') 
     password = request.POST.get('password', '') 
     user = auth.authenticate(email=email, password=password) 

     if user is not None and user.is_active: 
      # Correct password, and the user is marked "active" 
      auth.login(request, user) 
      # Redirect to a success page. 
      return HttpResponseRedirect("/main/home/") 
     else: 
      # Show an error page 
      error = True 
      return HttpResponseRedirect("/main/", {'error': error}) 

私が得たエラー - http://dpaste.com/0ZVHW0P

私がdjangoに慣れているという事実を考慮して回答してください。 ありがとうございます。

答えて

0

したがって、電子メールアドレスを識別子として使用したい場合でも、Djangoの認証フレームワークを使用する場合は、認証テーブルにusernameフィールドを使用する必要があります。 。

あなたのユーザー名を設定していないということは、auth_userテーブルに空のユーザー名があることです。ユーザー名である必要があります。ユーザー名を使用せずに2番目のユーザーを追加しようとすると、データベースレベルの整合性制約UNIQUE constraint failed: auth_user.usernameが取得されます。この問題を解決するには

、次のように見えるためにあなたのviews.pyを変更します。

class UserFormView(View): 

    form_class = UserForm 
    template_name = 'main/registration_form.html' 

    def get(self, request): 
     form = self.form_class(None) 
     return render(request, self.template_name, {'form': form}) 

    def post(self, request): 
     form = self.form_class(request.POST) 

     if form.is_valid(): 

      user = form.save(commit=False) 

      # cleaned (normalized) data 
      email = form.cleaned_data['email'] 
      password = form.cleaned_data['password'] 
      user.username = email 
      user.set_password(password) 
      user.save() 

      # return user objects if credentials are correct 
      user = authenticate(username=email, password=password) 

      if user is not None: 

       if user.is_active: 
        login(request, user) 
        # request.user.username  display their username 
        return redirect('main:register2') 
     return render(request, self.template_name, {'form': form}) 

class LoginForm(View): 

    form_class = UserForm 
    template_name = 'main/login_form.html' 
関連する問題