DjangoユーザーモジュールのAbstractUser拡張

最近ブログを書いていて、ユーザー登録・キャンセルモジュールについて書いたところですが、この点はとても面白いと思います。Djangoのソースコードを開こうとすると、すべてのAPIがそれほど無形になるわけではありません。Djangoの各モジュールのソースコードを読み取ることで、コードをより柔軟に変更して、必要な機能を実現できます。

ここで、質問について考えてみましょう。主な要件は、ブログでユーザーの登録、ログイン、およびログアウト機能を実現することです。登録時にユーザーのメールボックスまたはユーザー名のみを登録するだけで満足できる場合は、Django独自のユーザーモジュールを実装できます。しかし実際には、一般的な要件は、登録ユーザーがアバター情報、電子メール情報、ニックネーム情報、およびその他のより柔軟な要件を変更できる必要があることです。

最初にDjangoユーザーモジュールのソースコードを見ることができます

class User(AbstractUser):
    """
    Users within the Django authentication system are represented by this
    model.

    Username, password and email are required. Other fields are optional.
    """
    class Meta(AbstractUser.Meta):
        swappable = 'AUTH_USER_MODEL'

注:アナコンダの管理者の場合は、パスビューにすることができC:\Users\User\Anaconda3\Lib\site-packages\django\contrib\auth\models.pyます

DjangoのUserモジュールは実際にはAbstractUserモジュールを継承しており、次のものがあります。

  • ユーザー名
  • ファーストネーム
  • 苗字
  • Eメール
  • date_joined

ご覧のとおりUser、モジュールはAbstractUser抽象基本クラスを継承しますが、単に継承され、AbstractUserには拡張機能がありません。したがって、ユーザーモジュール情報の需要を増やす必要がある場合はAbstractUser、ニーズに応じて継承および拡張できます。

ここで、アバターを変更するユーザーのサポート、ユーザーのニックネーム、qq、wechat、Webサイトのリンクのサポートなど、ユーザー属性の要件をいくつか追加します。

class User(AbstractUser):
    nickname = models.CharField(max_length=30, blank=True, null=True, verbose_name='昵称')
    qq = models.CharField(max_length=20, blank=True, null=True, verbose_name='QQ号码')
    url = models.URLField(max_length=100, blank=True, null=True, verbose_name='个人网页地址')
    avatar = ProcessedImageField(upload_to='avatar',
default='avatar/default.png', verbose_name='头像')

    class Meta:
        verbose_name = '用户'
        verbose_name_plural = verbose_name
        ordering = ['-id']

    def __str__(self):
        return self.username

ニックネーム(ニックネーム)、qq、url(Webリンク)、およびアバター(アバター)属性をカスタムユーザーモジュールに追加します。

注:カスタムDjangoをユーザーモデルを使用して識別できるようsettings.pyにするにはsettings.py、追加されたカスタムモジュールの設定位置にある必要があります

AUTH_USER_MODEL = 'blog.user'

ここでblog次のアプリケーションのためのあなたの情報をアプリに対応したアプリケーションは、ユーザーのブログuserモジュール、どこbloguser大文字と小文字を区別しません。

ここでデータベース移行コマンドを実行すると、ユーザーモジュールがブログ存在しないというプロンプトが表示れる場合があり、データ移行を再度実行することはできません。

ValueError: The field account.EmailAddress.user was declared with a lazy reference to 'blog.user', but app 'blog' doesn't provide model 'user'.
The field admin.LogEntry.user was declared with a lazy reference to 'blog.user', but app 'blog' doesn't provide model 'user'.
The field blog.Article.author was declared with a lazy reference to 'blog.user', but app 'blog' doesn't provide model 'user'.
The field easy_comment.Comment.user was declared with a lazy reference to 'blog.user', but app 'blog' doesn't provide model 'user'.
The field easy_comment.Like.user was declared with a lazy reference to 'blog.user', but app 'blog' doesn't provide model 'user'.
The field notifications.Notification.recipient was declared with a lazy reference to 'blog.user', but app 'blog' doesn't provide model 'user'.
The field online_status.OnlineStatus.user was declared with a lazy reference to 'blog.user', but app 'blog' doesn't provide model 'user'.
The field socialaccount.SocialAccount.user was declared with a lazy reference to 'blog.user', but app 'blog' doesn't provide model 'user'.

したがって、たとえば、AUTH_USER_MODEL = auth.userユーザーモデルを使用する前に、それをカスタムに再配置する場合は、ディレクトリ内のすべてのファイルとデータベースファイルAUTH_USER_MODEL = blog.userを削除migrationsしてください

削除後、データベースを再移行します

$ python manage.py makemigrations myapp
$ python manage.py migrate

このとき、使用するユーザーはカスタマイズ後のユーザーです。

  File "C:\Users\Micky\Anaconda3\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\Micky\Anaconda3\lib\site-packages\django\db\backends\sqlite3\base.py", line 303, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: blog_user

ここで、テンプレートでデータベースを指定できます db_table = 'user'

おすすめ

転載: blog.csdn.net/qq_36148847/article/details/82599180
おすすめ