LoginSignup
coltonOP
@coltonOP (こるとんくん)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

AttributeError: 'UserManager' object has no attribute 'normalize_syain_number_s'

Q&AClosed

解決したいこと

次のエラーが出ていて詰まっています。
原因がわかる方いらっしゃいますでしょうか?

発生している問題・エラー

 File "C:\djangoprojects\scheduleweb\account\models.py", line 28, in _create_user
    syain_number_s = self.normalize_syain_number_s(syain_number_s) ,
AttributeError: 'UserManager' object has no attribute 'normalize_syain_number_s'

models.py

 class UserManager(UserManager):
    
    def _create_user(self, syain_number_s, name_s, yakusyoku_s, syozoku_number_s, email_s, password, **extra_fields):
        
        if not syain_number_s:
            raise ValueError("社員番号を入力してください")
            
        if not name_s:
            raise ValueError("名前を入力して下さい。")
            
        if not yakusyoku_s:
            raise ValueError("役職が設定されていません。")
            
        if not syozoku_number_s:
            raise ValueError("所属番号を入力して下さい。")
            
        if not email_s:
            raise ValueError("メールアドレスを入力して下さい。")
        
        user = self.model(
                            syain_number_s = self.normalize_syain_number_s(syain_number_s) ,
                            email_s = self.normalize_email(email_s),
                            yakusyoku_s = self.normalize_yakusyoku_s(yakusyoku_s),
                            syozoku_number_s = self.normalize_syozoku_number_s(syozoku_number_s),
                            name_s = self.normalize_name_s(name_s),
                            **extra_fields
                         )
        user.set_password(password)
        user.save(using=self._db)
        print(self)
        return user

    def create_user(self, syain_number_s, name_s, yakusyoku_s, syozoku_number_s, email_s, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(self, syain_number_s, name_s, yakusyoku_s, syozoku_number_s, email_s, password, **extra_fields)

    def create_superuser( syain_number_s, name_s, yakusyoku_s, syozoku_number_s, email_s, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(syain_number_s, name_s, yakusyoku_s, syozoku_number_s, email_s, password, **extra_fields)

自分で試したこと

いろいろ試行錯誤して数時間経つので、聞いてみることにしました。

0

1Answer

        return self._create_user(self, syain_number_s, name_s, yakusyoku_s, syozoku_number_s, email_s, password, **extra_fields)

第1引数の self が余計です。

1

Comments

  1. @coltonOP

    Questioner
    ありがとうございます。selfを消したら新しいエラーがでました。
  2. エラーにそのまま書いてあるとおり、  UserManager クラスに normalize_syain_number_s メソッドが定義されていないせいです。
  3. @coltonOP

    Questioner
    つまりnormalize_syain_number_s は使えないってことですね。
    いろいろとありがとうございました。
  4. また
    class UserManager(UserManager):
    で親クラス名の指定を間違えており、自分自身を継承することになってしまっています。

    もし normalize_syain_number_s メソッドを親クラスで定義してあるなら、↑のミスのせいでエラーになっています。そこを直せばエラーが解消するはずです。
  5. > つまりnormalize_syain_number_s は使えないってことですね。

    コメントが入れ違いになりましたが、使えないのではなく元々定義していないか、親クラス名を間違えているせいかのどちらかです。定義するか親クラス名を直せば使えます。
  6. @coltonOP

    Questioner
    https://qiita.com/startours777/items/706d38e712b0c737a16a

    こちらの記事を元に製作を行っているのですが、UseManager(UserManager):
    と記述されていたので多分、importしたUseManagerにメソッドが定義されていないんだと気付きました。 

    ```
    × syain_number_s = self.normalize_syain_number_s(syain_number_s)

    ○ syain_number_s = syain_number_s
    ```

    これでうまくいきました。
  7. 解決してよかったです。

    全体のソースを読んで気づきましたが、
    >自分自身を継承することになってしまっています。
    この説明は間違いでした。
    django.contrib.auth.models.UserManager を継承して、同名だが別物の UserManager クラスを作っています。つまり親クラス名はこれで合っていました。

    ところで、
    ○ syain_number_s = syain_number_s
    これは syain_number_s 変数に自身の値を代入し直す無意味な操作なので、この行ごと消せます。

Your answer might help someone💌