前提・実現したいこと
現在私は、Teacher及びAthleteと言う2種類のUserが利用するアプリケーションを作ってみたいと思っております。
しかし、2種類のユーザーを別々にサインアップさせるコードを書いたところ、不具合が生じて大変困っております。
何かアドバイスをいただけたら嬉しく思います。
発生している問題・エラーメッセージ
accountsと言うアプリケーションで、Teacher用とAthlete用の新規登録(会員登録のような)を実装したいです。
新規登録Formのhtmlは 双方共に表示されるのですが、その後指定のurlに飛ばず、adminで見るとユーザーが追加されていないようです。
※上記のユーザーが追加されないと言うものは改善いたしました。
NoReverseMatch at /accounts/signup/teacher/
'app' is not a registered namespace
該当のソースコード
accounts/models.py
models
1 2class User(AbstractUser): 3 is_athlete = models.BooleanField(default=False) 4 is_teacher = models.BooleanField(default=False) 5 6class Athlete(models.Model): 7 user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True) 8 name = models.CharField("アスリート名", max_length=128) 9 category = models.ForeignKey(Category, 10 verbose_name="カテゴリー", 11 on_delete=models.SET_NULL, 12 null=True, blank=True, 13 related_name='athlete_category') 14 age = models.PositiveIntegerField("年齢")
accounts/views.py
登録後は、ログイン状態を保ったまま別のappと言うアプリケーションの一覧ページに遷移させたいです。
views
1class TeacherSignUpView(generic.CreateView): 2 model = User 3 form_class = TeacherSignUpForm 4 template_name = 'registration/signup_teacher.html' 5 6 def get_context_data(self, **kwargs): 7 kwargs['user_type'] = 'teacher' 8 return super().get_context_data(**kwargs) 9 10 def form_valid(self, form): 11 user = form.save() 12 login(self.request, user) 13 return redirect('app:list') 14 15 16class AthleteSignUpView(generic.CreateView): 17 model = User 18 form_class = AthleteSignUpForm 19 template_name = 'registration/signup_athlete.html' 20 21 def get_context_data(self, **kwargs): 22 kwargs['user_type'] = 'athlete' 23 return super().get_context_data(**kwargs) 24 25 def form_valid(self, form): 26 user = form.save() 27 login(self.request, user) 28 return redirect('app:list')
accounts/forms.py
forms
1 2class TeacherSignUpForm(UserCreationForm): 3 class Meta: 4 model = User 5 fields = ("username", "password1", "password2") 6 7 def clean_password(self): 8 password = self.cleaned_data.get('password1') 9 if not re.search(r'\d', password): 10 raise forms.ValidationError('数字が含まれていません') 11 if not re.search(r'[a-zA-Z]', password): 12 raise forms.ValidationError('アルファベットが含まれていません') 13 return password 14 15 16 def save(self, commit=True): 17 user = super().save(commit=False) 18 user.is_teacher = True 19 if commit: 20 user.save() 21 return user 22 23 24class AthleteSignUpForm(UserCreationForm): 25 class Meta: 26 model = User 27 fields = ("username", "password1", "password2") 28 29 def clean_password(self): 30 password = self.cleaned_data.get('password1') 31 if not re.search(r'\d', password): 32 raise forms.ValidationError('数字が含まれていません') 33 if not re.search(r'[a-zA-Z]', password): 34 raise forms.ValidationError('アルファベットが含まれていません') 35 return password 36 37 @transaction.atomic 38 def save(self): 39 user = super().save(commit=False) 40 user.is_athlete = True 41 user.save() 42 athlete = Athlete.objects.create(user=user) 43 return user 44 45
accounts/urls.py
urls
1from django.urls import path 2 3from accounts import views 4 5app_name = 'accounts' 6 7urlpatterns = [ 8 path('signup/', views.signup, name='signup'), # Athlete, Teacherどちらの新規登録かを選択するだけのページです。 9 path('signup/athlete/', views.AthleteSignUpView.as_view(), name='signup_athlete'), 10 path('signup/teacher/', views.TeacherSignUpView.as_view(), name='signup_teacher'), 11]
accounts/settings.py
settings
1AUTH_USER_MODEL = 'accounts.User'
accounts/templates/registration/signup_athlete.html
html
1{% extends 'base.html' %} 2 3{% block title %}Athleteユーザー登録{% endblock %} 4 5{% block content %} 6<div class="container"> 7 <div class=" card"> 8 <div class="card-header bg-primary text-white"> 9 Athlete登録フォーム 10 </div> 11 <div class="card-body"> 12 <form action="{% url 'accounts:signup_athlete' %}" method="post" enctype="multipart/form-data"> 13 {% csrf_token %} 14 {% for field in form %} 15 <div class="form-group"> 16 <label for="{{ field.id_for_label }}">{{ field.label_tag }}</label> 17 {{ field }} 18 {{ field.errors }} 19 </div> 20 {% endfor %} 21 <div class="form-group"> 22 <button type="submit" class="btn btn-primary">登録</button> 23 </div> 24 </form> 25 </div> 26 </div> 27</div> 28{% endblock %} 29
accounts/templates/registration/signup_teacher.html
html
1{% extends 'base.html' %} 2 3{% block title %}Teacherユーザー登録{% endblock %} 4 5{% block content %} 6<div class="container"> 7 <div class=" card"> 8 <div class="card-header bg-primary text-white"> 9 Teacher登録フォーム 10 </div> 11 <div class="card-body"> 12 <form action="{% url 'accounts:signup_teacher' %}" method="post" enctype="multipart/form-data"> 13 {% csrf_token %} 14 {% for field in form %} 15 <div class="form-group"> 16 <label for="{{ field.id_for_label }}">{{ field.label_tag }}</label> 17 {{ field }} 18 {{ field.errors }} 19 </div> 20 {% endfor %} 21 <div class="form-group"> 22 <button type="submit" class="btn btn-primary">登録</button> 23 </div> 24 </form> 25 </div> 26 </div> 27</div> 28{% endblock %}
app/urls.py
urls
1urlpatterns = [ 2 path('', views.athlete_list, name='list') 3]
試したこと
何かと検索しまくりましたが、どこがいけないのか混乱してきてしまいました。
お手数ですがご返答いただけたら幸いです。
補足情報(FW/ツールのバージョンなど)
使用しているのはDjango3.0.5、Python3.8.1です
回答2件
あなたの回答
tips
プレビュー