如何在Django中使用用户模型
Django的内置认证系统非常好。在大多数情况下,我们可以使用它的开箱即用,节省了大量的开发和测试工作。它适合大多数的用例,而且非常安全。但有时我们需要做一些微调,以便适合我们的Web应用。通常我们想多存储一些与用户有关的数据,但下一个问题可能是,Django开发者应该如何引用一个用户?Django的官方文档中列出了三种不同的方式。
- User
- AUTH_USER_MODEL
- get_user_model()
解释:
通过一个例子说明如何引用用户模型。考虑一个名为mysite的项目,有一个名为blog的应用程序。
方法1–用户模式直接:
在models.py里面添加以下代码。
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=50)
content= models.TextField()
def __str__(self):
return self.title
通过在admin.py中添加以下代码来注册这个模型。
from django.contrib import admin
from .models import Post
# Register your models here.
admin.site.register(Post)
某些类型的项目可能有认证要求,而Django内置的用户模型并不总是适合。例如,在一些网站上,使用电子邮件地址作为你的身份标识而不是用户名更有意义。
Django允许你通过为AUTH_USER_MODEL设置提供一个引用自定义模型的值来覆盖默认的用户模型。
方法2 – AUTH_USER_MODEL :
当在models.py文件中引用一个用户模型时,AUTH_USER_MODEL是推荐的方法。
为此,你需要通过子类化AbstractUser或AbstractBaseUser来创建自定义用户模型。
- AbstractUser: 如果你对用户模型上的现有字段很满意,只是想删除用户名字段,请使用这个选项。
- AbstractBaseUser: 如果你想从头开始创建你自己的、全新的用户模型,请使用这个选项。
如果你已经在一个名为users的应用程序中创建了一个自定义的用户模型,例如CustomUser,你可以在settings.py文件中引用它,如下所示。
#settings.py
AUTH_USER_MODEL = 'users.CustomUser'
然后在blog models.py中加入以下代码。
# blog/models.py
from django.conf import settings
from django.db import models
class Post(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
title = models.CharField(max_length=50)
content = models.TextField()
通过在admin.py中添加以下代码来注册这个模型。
from django.contrib import admin
from .models import Post
# Register your models here.
admin.site.register(Post)
方法3 – get_user_model() :
如果你直接引用User(例如,通过在外键中引用它),你的代码将不能在AUTH_USER_MODEL设置已改为不同用户模型的项目中工作。
另一种引用用户模型的方式是通过get_user_model,它返回当前激活的用户模型:要么是AUTH_USER_MODEL中指定的自定义用户模型,要么是默认的内置用户。
在models.py里面添加以下代码。
from django.db import models
from django.contrib.auth import get_user_model
User=get_user_model()
# Create your models here.
class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=50)
content= models.TextField()
def __str__(self):
return self.title
通过在admin.py中添加以下代码来注册这个模型。
from django.contrib import admin
from .models import Post
# Register your models here.
admin.site.register(Post)
输出 –
以作者为用户创建实例