最近ブログを書いていて、ユーザー登録・キャンセルモジュールについて書いたところですが、この点はとても面白いと思います。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
モジュール、どこblog
とuser
大文字と小文字を区別しません。
ここでデータベース移行コマンドを実行すると、ユーザーモジュールがブログに存在しないというプロンプトが表示される場合があり、データ移行を再度実行することはできません。
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'