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

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

ただいまの
回答率

88.93%

[Django]FormViewを使用したアカウント作成処理でエラーが発生する。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 237

__tanaka__

score 5

前提・実現したいこと

DjangoでBLOGを作成しております。

FormViewを利用して
アカウント作成の処理を書いておりますが、以下エラーが発生しております。
init() takes 1 positional argument but 2 were given

前提条件として何か必要でしょうか。

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

TypeError at /user/add
__init__() takes 1 positional argument but 2 were given
Request Method:    GET
Request URL:    http://localhost:8080/user/add
Django Version:    3.0.8
Exception Type:    TypeError
Exception Value:    
__init__() takes 1 positional argument but 2 were given
Exception Location:    /usr/local/lib64/python3.6/site-packages/django/core/handlers/base.py in _get_response, line 113
Python Executable:    /usr/bin/python3
Python Version:    3.6.8
Python Path:    
['/var/www/html/wto_web_app',
 '/usr/lib64/python36.zip',
 '/usr/lib64/python3.6',
 '/usr/lib64/python3.6/lib-dynload',
 '/usr/local/lib64/python3.6/site-packages',
 '/usr/local/lib/python3.6/site-packages',
 '/usr/lib64/python3.6/site-packages',
 '/usr/lib/python3.6/site-packages']
Internal Server Error: /user/add
Traceback (most recent call last):
  File "/usr/local/lib64/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/local/lib64/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/local/lib64/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
TypeError: __init__() takes 1 positional argument but 2 were given

該当のソースコード

### user/view.py
class UserAdd(FormView):
    context_object_name = 'add_user'
    template_name = 'user/user_add.html'
    form_class = UserAddForm

    def form_valid(self, form):
        password = form.cleaned_data.get('password')
        user = User.objects.create_user(
            screen_id = form.cleaned_data.get('screen_id'),
            email = form.cleaned_data.get('email'),
            password = password
        )
        user.icon = form.cleaned_data.get('icon')
        user.screen_name = form.cleaned_data.get('screen_name')
        user.full_name = form.cleaned_data.get('full_name')
        user.full_kana = form.cleaned_data.get('full_kana')
        user.resident_flag = form.cleaned_data.get('resident_flag')
        user.notification_flag = form.cleaned_data.get('notification_flag')
        user.city = form.cleaned_data.get('country')
        user.save()
        return super().form_valid(form)

    def form_invalid(self, form):
        return super().form_invalid(form)

    def get_success_url(self):
        return reverse_lazy('top_page')
### user/forms.py
class UserAddForm(forms.Form):

    # アイコン
    icon = forms.ImageField(
        label='アイコン',
        widget=forms.TextInput(), #あとで
        required=False, # defであとで定義
    )

    # ユーザー名
    screen_name = forms.CharField(
        label='ユーザー名',
        max_length=30,
        widget=forms.TextInput(),
        error_messages={
            'required': get_error_message(message='required_user_screen_name'),
        }
    )

    # ID
    screen_id = forms.CharField(
        label='ID',
        widget=forms.TextInput(),
        max_length=30,
        min_length=6,
        error_messages={
            'required': get_error_message(message='required_user_screen_id'),
            'min_length': get_error_message(message='min_length',num='6')
        }
    )

    # 氏名
    full_name = forms.CharField(
        label='氏名',
        max_length=60,
        error_messages={
            'required': get_error_message(message='required_user_name'),
        }
    )

    # フリガナ
    full_kana = forms.CharField(
        label='フリガナ',
        max_length=60,
        error_messages={
            'required': get_error_message(message='required_user_kana'),
        }
    )

    # メールアドレス
    email = forms.CharField(
        label='メールアドレス',
        max_length=255,
        widget=forms.TextInput(),
        error_messages={
            'required': get_error_message(message='required_user_email'),
            'max_length': get_error_message(message='max_length',num='128')
        }
    )

    # 海外在住フラグ
    resident_flag = forms.ChoiceField(
        label= '海外在住の有無',
        widget=forms.RadioSelect,
        choices=RESIDENT_CHOICE,
    )

    # 通知フラグ
    notification_flag = forms.ChoiceField(
        label= '通知',
        widget=forms.RadioSelect,
        choices=NOTIFICATION_CHOICE,
    )

    # パスワード
    password = forms.CharField(
        label='パスワード',
        widget=forms.PasswordInput(),
        max_length=30,
        min_length=10,
        error_messages={
            'required': get_error_message(message='required_password'),
        }
    )

    # パスワード確認
    password_verification = forms.CharField(
        label='パスワード確認',
        widget=forms.PasswordInput(),
        max_length=30,
        min_length=10,
        error_messages={
            'required': get_error_message(message='required_password_verification'),
        }
    )

    # 興味のある国
    country=forms.MultipleChoiceField(
        label='興味のある国',
        required=False,
        widget=forms.CheckboxSelectMultiple
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 国リスト
        countries = City.objects.all()
        list = []
        for country in countries:
            list.append((str(country.pk),country.country_name))
        self.fields['country'].choices = list

試したこと

class から def にすると表示は可能なことからforms.pyの記述には問題なし(?)
def StudentUserAdd(FormView):
return HttpResponse(str(UserAddForm()))

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

Python3.6.8
Django3.0.8

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

urls.pyの記述が誤っておりました。
path('add', views.StudentUserAdd,name='user_add')

path('add', views.StudentUserAdd.as_view(),name='user_add')

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る