DRF SimpleJWT 删除密码并添加日期字段
Posted
技术标签:
【中文标题】DRF SimpleJWT 删除密码并添加日期字段【英文标题】:DRF SimpleJWT remove password and add date field 【发布时间】:2020-09-15 20:50:58 【问题描述】:我创建了一个从 AbstractBaseUser 扩展的自定义用户模型,其中我从用户那里获得的唯一数据是用户 ID、用户(用户名字段)和日期(必需,格式为 dd-mm-yyyy) 并且用户的创建工作正常,您可以从下一张图片中的数据库中看到
使用password = None
和last_login = None
表示我不想要密码和last_login 表。
然后,创建了一个只有经过身份验证的用户才能访问的视图。
为了处理身份验证,使用了simpleJWT。在 urls.py 中
# JWT Token
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain'),
# Get a new token before the old expires.
path('api/token/refresh/', TokenRefreshView.as_view, name='token_refresh'),
通过转到 http://127.0.0.1:8000/api/token/ ,这就是我所看到的(按预期工作)
我之前在另一个项目中使用包含该数据(用户和密码)的用户模型测试了用户和密码,并且工作正常。现在,在这里,如果我尝试使用现有用户发布但没有密码,我会收到警告并且无法发布
此字段不能为空。
如果我添加除空格以外的任何内容,则会出现以下错误
/api/token/ 处的类型错误 “NoneType”类型的对象没有 len()
如何删除密码字段?另外,我怎样才能添加一个日期字段呢?
【问题讨论】:
在没有密码的情况下获取用户令牌有什么意义? @ArakkalAbu 这是针对特定场景的,这是需要的。 知道您的要求,但是,如果我知道您的 "用户名" 怎么办? 我知道@ArakkalAbu 【参考方案1】:我也遇到了同样的问题,我设法解决了这个问题。
这是解决方案,
重写TokenObtainPairSerializer
类__init__
方法,如下所示,
使用del password
,这样它就不会询问您密码并添加您想要的任何字段。
class CustomSerializer(TokenObtainPairSerializer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields[self.username_field] = serializers.CharField()
del self.fields['password']
self.fields['last_login'] = serializers.DateField(initial=datetime.date.today)
这真的很好用。
这是参考 - How to skip or remove password field in simplejwt token authentication in django rest framework??
如果有人对此有更好的解决方案,请告诉我。
【讨论】:
以上是关于DRF SimpleJWT 删除密码并添加日期字段的主要内容,如果未能解决你的问题,请参考以下文章
DRF 简单 jwt 从用户实例获取身份验证令牌或更改用户名和密码组合