質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1126閲覧

Djangoで2つのユーザータイプにわけて新規登録させたいのですが、追加できません。。。

PTm

総合スコア5

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/04/18 15:59

編集2020/04/18 20:18

前提・実現したいこと

現在私は、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です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

llr114

2020/04/18 19:22

signup_teacher.html, signup_athlete.htmlのコードもいただいてもよろしいでしょうか? また、その後指定のurlに飛ばず、とありますが、現状どこに飛んでいるのでしょうか?
PTm

2020/04/18 20:19

正しいサイトに遷移しなかったのは、urlが間違っていたからでした。ご指摘誠にありがとうございます。しかしながら、現在もErrorが生じ、app:listに遷移いたしません。エラー内容を書き足しましたので、ご回答いただけたら幸いです。
guest

回答2

0

Python

1return redirect('app:list')

としてますが、下記ではないでしょうか?

また、質問で提示されているapp/urls.pyは、accounts/urls.pyではないでしょうか?

Python

1return redirect('accounts:list')

投稿2020/04/19 03:45

hasami

総合スコア1277

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

views.pyで

python

1 def form_valid(self, form): 2 user = form.save(commit=False) 3 user.user_type = 'teacher' 4 user.save()

のように、
まずcommit=Falseでsave
次にuser_typeに値を入れる
最後にcommit=True(デフォルト)で保存

とするとできるはずです。

この場合、get_context_dataはいらないと思います。

投稿2020/04/18 22:02

編集2020/04/18 22:04
ak_suzuki

総合スコア194

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PTm

2020/04/19 06:24

ご回答ありがとうございます。 コードをこちらに書き換えると、 save() got an unexpected keyword argument 'commit' と言う表示が出てきてしまいます。 formを引数にしているのですが、なぜエラーが出てきてしまうのかご教授いただけたら幸いです。
ak_suzuki

2020/04/19 21:19

`user = form.save(commit=False)` => `user = form_class.save(commit=False)` ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問