🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

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

Q&A

解決済

1回答

3559閲覧

Djangoでのユーザー登録機能の実装中のエラー対処について

tetsuk

総合スコア6

Django

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

0グッド

0クリップ

投稿2020/11/29 04:10

編集2020/11/29 04:20

前提・実現したいこと

複数ユーザーが登録できるブログアプリを作成しようと考え、その中で、オーソドックスなユーザー登録機能を実装しようとしています。
(今後、拡張ユーザーモデルを利用しようと考えていますが、現時点では、class-based viewを使って、できるだけシンプルに実装しておければと考えています。)

発生している問題・エラーメッセージ

関連するサイトや本を読んで、ユーザー登録機能を一通り実装したと思ったのですが、下記のエラーが発生しています。
解決方法について教示いただければ幸いです。

ImproperlyConfigured at /signup/ SignupView is missing a QuerySet. Define SignupView.model, SignupView.queryset, or override SignupView.get_queryset(). Request Method: GET Request URL: http://127.0.0.1:8000/signup/ Django Version: 3.1.2 Exception Type: ImproperlyConfigured Exception Value: SignupView is missing a QuerySet. Define SignupView.model, SignupView.queryset, or override SignupView.get_queryset(). Exception Location: /opt/anaconda3/envs/django-env/lib/python3.9/site-packages/django/views/generic/detail.py, line 69, in get_queryset Python Executable: /opt/anaconda3/envs/django-env/bin/python Python Version: 3.9.0 Python Path: ['/Users/user/Documents/django_work/reportproject', '/opt/anaconda3/envs/django-env/lib/python39.zip', '/opt/anaconda3/envs/django-env/lib/python3.9', '/opt/anaconda3/envs/django-env/lib/python3.9/lib-dynload', '/opt/anaconda3/envs/django-env/lib/python3.9/site-packages']

該当のソースコード

reportproject/accounts/views.py

python

1from django.contrib.auth import login 2from django.urls import reverse_lazy 3from django.views.generic import CreateView 4 5from .forms import SignupForm 6 7 8class SignupView(CreateView): 9 from_class = SignupForm 10 success_url = reverse_lazy('reportpost:list') 11 template_name = 'signup.html' 12 13 def from_valid(self, form): 14 # self.objectにsave()されたユーザーオブジェクトが格納される 15 valid = super().form_valid(form) 16 login(self.request, self.object) 17 return valid

reportproject/accounts/urls.py

python

1from django.contrib import admin 2from django.urls import path 3from django.contrib.auth import views as auth_views 4from . import views 5 6app_name = 'accounts' 7urlpatterns = [ 8 path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'), 9 path('logout/', auth_views.LogoutView.as_view(), name='logout'), 10 path('signup/', views.SignupView.as_view(), name='signup'), 11]

reportproject/accounts/forms.py

python

1from django import forms 2from django.contrib.auth.forms import UserCreationForm 3from django.contrib.auth.models import User 4 5class SignupForm(UserCreationForm): 6 class Meta: 7 model = User 8 fields = ('username', 'email', 'password1', 'password2')

※ なお、**reportproject/accounts/**内の、models.pyにはデフォルト以上に何も記述しておりません。

reportproject/templates/signup.html

html

1{% extends "base.html" %} 2{% load bootstrap4 %} 3 4{% block title %}ユーザー登録{% endblock %} 5 6{% block content %} 7 8<h2>ユーザー登録</h2> 9<form class="mt-4 mb-3" action="" method="POST"> 10 {% csrf_token %} 11 {% bootstrap_form form %} 12 <input type="submit" class="btn btn-block btn-outline-primary" value="ユーザー登録"> 13</form> 14 15{% endblock %}

試したこと

エラーメッセージを参考に、 SignupViewクラスにget_query関数を入れようとしましたが、あまり解決に向かっているようには思えません。

reportproject/accounts/views.py (暫定的に変更)

python

1from django.contrib.auth import login 2from django.urls import reverse_lazy 3from django.views.generic import CreateView 4# 暫定 5from django.contrib.auth.models import User 6 7from .forms import SignupForm 8 9 10class SignupView(CreateView): 11 from_class = SignupForm 12 success_url = reverse_lazy('reportpost:list') 13 template_name = 'signup.html' 14 15 def get_queryset(self): # 暫定 16 return User.objects.all() 17 18 def from_valid(self, form): 19 # self.objectにsave()されたユーザーオブジェクトが格納される 20 valid = super().form_valid(form) 21 login(self.request, self.object) 22 return valid

新たに出現したエラーメッセージ

python

1mproperlyConfigured at /signup/ 2Using ModelFormMixin (base class of SignupView) without the 'fields' attribute is prohibited. 3Request Method: GET 4Request URL: http://127.0.0.1:8000/signup/ 5Django Version: 3.1.2 6Exception Type: ImproperlyConfigured 7Exception Value: 8Using ModelFormMixin (base class of SignupView) without the 'fields' attribute is prohibited. 9Exception Location: /opt/anaconda3/envs/django-env/lib/python3.9/site-packages/django/views/generic/edit.py, line 96, in get_form_class 10Python Executable: /opt/anaconda3/envs/django-env/bin/python 11Python Version: 3.9.0 12Python Path: 13['/Users/user/Documents/django_work/reportproject', 14 '/opt/anaconda3/envs/django-env/lib/python39.zip', 15 '/opt/anaconda3/envs/django-env/lib/python3.9', 16 '/opt/anaconda3/envs/django-env/lib/python3.9/lib-dynload', 17 '/opt/anaconda3/envs/django-env/lib/python3.9/site-packages']

補足情報(FW/ツールのバージョンなど)

conda 4.9.2
django 3.1.2
python 3.9.0

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

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

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

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

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

guest

回答1

0

自己解決

Model / Form が上手く連携されていない、というところを再確認していたところ、
reportproject/accounts/views.py
において、

form_class = SignupForm

と書くべきところを

from_class = SignupForm

と書いているのを発見しました。修正したところエラーが解消されましたので済にさせて頂きます。

投稿2020/11/29 08:23

編集2020/11/29 08:24
tetsuk

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問