前提・実現したいこと
【結論】
djangoで開発したwebサイト(会員登録機能付き)に、
ワンクリックでログインできるテストユーザー機能を実装したいです。
【概要】
通常はニックネームとメールアドレス、パスワード、氏名を入力する事で会員登録を行い、
自分のプロフィールを公開する使用となっております。
今回実装したいテストユーザー機能は
上記の手順を行う事なく会員登録したユーザーと同じ権限を与えられる様にしたいです。
発生している問題・エラーメッセージ
テストユーザーでログインしたものの、
プロフィール情報を登録しようとすると下記のエラーが出てしまいます。
Django
1#web画面 2IntegrityError at /test_login/ 3UNIQUE constraint failed: register_user.email 4 5#コンソール 6django.db.utils.IntegrityError: UNIQUE constraint failed: register_user.email
該当のソースコード
django
1#views.py 2 3class TestCreate(generic.CreateView): 4 """テストユーザー""" 5 template_name = 'register/user_form.html' 6 form_class = UserUpdateForm 7 8 def form_valid(self,form): 9 user = form.save(commit=False) 10 user.is_active = True 11 user.save() 12 13 return redirect('register:user_detail', pk=user.pk) 14
django
1#app/urls.py 2 3from django.urls import path 4from . import views 5 6app_name = 'register' 7 8urlpatterns = [ 9 path('test_login/', views.TestCreate.as_view(), name='test_login'), 10 #他省略 11] 12
django
1#models.py 2 3class User(AbstractBaseUser, PermissionsMixin): 4 """カスタムユーザーモデル.""" 5 6 email = models.EmailField(_('email address'), unique=True) 7 first_name = models.CharField(_('first name'), max_length=30, blank=True) 8 last_name = models.CharField(_('last name'), max_length=150, blank=True) 9 nick_name = models.CharField(_('ニックネーム'), max_length=30, blank=False) 10 created_at = models.DateTimeField(default=timezone.now) 11 12 13 is_staff = models.BooleanField( 14 _('staff status'), 15 default=False, 16 help_text=_( 17 'Designates whether the user can log into this admin site.'), 18 ) 19 is_active = models.BooleanField( 20 _('active'), 21 default=True, 22 help_text=_( 23 'Designates whether this user should be treated as active. ' 24 'Unselect this instead of deleting accounts.' 25 ), 26 ) 27 date_joined = models.DateTimeField(_('date joined'), default=timezone.now) 28 29 objects = UserManager() 30 31 EMAIL_FIELD = 'email' 32 USERNAME_FIELD = 'email' 33 REQUIRED_FIELDS = [] 34 35 class Meta: 36 verbose_name = _('user') 37 verbose_name_plural = _('users') 38 39 def get_full_name(self): 40 """Return the first_name plus the last_name, with a space in 41 between.""" 42 full_name = '%s %s' % (self.first_name, self.last_name) 43 return full_name.strip() 44 45 def get_short_name(self): 46 """Return the short name for the user.""" 47 return self.first_name 48 49 def email_user(self, subject, message, from_email=None, **kwargs): 50 """Send an email to this user.""" 51 send_mail(subject, message, from_email, [self.email], **kwargs) 52 53 @property 54 def username(self): 55 """username属性のゲッター 56 57 他アプリケーションが、username属性にアクセスした場合に備えて定義 58 メールアドレスを返す 59 """ 60 return self.email 61
試したこと
テーブルにemailの情報がすでに入っているのかと思い、
migrationsファイルの中身を削除し再度、メイクマイグレーション、マイグレートしましたが同じ結果となりました。
また、UNIQUE制約をFalseにすると同じメールアドレスで登録できる事になってしまうので
補足情報(FW/ツールのバージョンなど)
こちらの機能は下記のサイトを元に作成しており、
テストユーザーはis_activeをTrueにしたものとなっております。
https://blog.narito.ninja/detail/38/
UNIQUE制約をFalseにすると同じメールアドレスで登録できる事になってしまうので、
unique=Trueのままがいいです。
あなたの回答
tips
プレビュー