<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在寫登入功能的時候看著網上的視訊學著做,然後看了原始碼的時候發現了一些有意思的功能,因此寫這一篇筆記分享給大家.
系統自帶的使用者系統的models
檔案的位置site-packagesdjangocontribauthmodels.py
,開啟這個檔案發現User類
繼承的是一個AbstractUser
類,因此我們想要使用系統自帶的使用者系統,只要在models
中重新寫一個User
類,也繼承AbstractUser
就可以了.
閱讀AbstractUser
類,發現了其中的對username
欄位做的幾個處理,第一個就是他新增了一個驗證器validators
,第二個增加了error_messages
,當在我們往資料庫中新增使用者資訊的時候,系統就會自動驗證是否符合要求,如果不符合要求,就會返回一個字典,將對應欄位的錯誤返回,這就是我想到的與其他博主所做的不同之處.
我想我的使用者類中有mobile,username,email,password四個欄位,我的需求:
mobile,username,email都是不能重複
驗證這幾個欄位的格式
返回的errormessage為中文
因此我就想到了模仿系統自帶的AbstractUser
的寫法:
這個驗證器是其中主要是驗證電話號碼和郵箱的格式正誤,因為其他的類也可能需要用到驗證器,因此我就在專案的utils
目錄下建立了一個validator.py
檔案,用於專門存取驗證器.專案根目錄utilsvalidator.py
程式碼:
# 驗證電話號碼是否有誤 import re from django.core.exceptions import ValidationError # 對手機格式進行驗證 class UnicodMobileValidator: def __call__(self, value): if not re.match(r"^1[3-9]d{9}$", value): raise ValidationError("對不起,手機格式有誤!") # 對郵箱格式進行驗證 class UnicodEmailValidator: def __call__(self, value): if not re.match(r"^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*.[a-zA-Z0-9]{2,6}$", value): raise ValidationError("對不起,郵箱格式有誤!")
這裡我繼承了AbstractUser
類,並且重寫了其中的方法和屬性.usermodels.py
程式碼:
from datetime import timezone from django.contrib.auth.validators import UnicodeUsernameValidator from django.db import models from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, AbstractUser from qianxingtong_main.utils.validator import UnicodMobileValidator, UnicodEmailValidator class User(AbstractUser): username_validator = UnicodeUsernameValidator() username = models.CharField( ("username"), max_length=150, unique=True, help_text=( "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." ), validators=[username_validator], error_messages={ "unique": ("該使用者名稱已經存在"), }, ) email = models.EmailField(("email address"), unique=True, validators=[UnicodEmailValidator()],error_messages={"unique": ("郵箱已經存在"),}) mobile = models.CharField(max_length=15, unique=True, validators=[UnicodMobileValidator()], error_messages={"unique": ("電話號碼已經存在")}, verbose_name="手機號碼") class Meta: db_table = "drf_user" verbose_name = "使用者資訊" verbose_name_plural = verbose_name
這裡在遷移資料的時候可能會出現錯誤,其中錯誤的解決方法參考我寫的筆記:https://www.jb51.net/article/275133.htm 的第三步
userserializers
程式碼:
from django.contrib.auth.hashers import make_password from rest_framework import serializers from user.models import User class UserSerializer(serializers.ModelSerializer): rpassword = serializers.CharField(required=True, write_only=True, help_text="確認密碼") token = serializers.CharField(max_length=1024, read_only=True, help_text="token認證字串") class Meta: model = User fields = ["id", "username", "email", "mobile", "password", "token", "rpassword"] # write_only:只寫入資料庫, extra_kwargs = { "mobile": { "write_only": True, }, "email": { "write_only": True, }, "id": { "read_only": True, }, } def validate(self, attrs): """校驗資訊""" password = attrs.get("password") rpassword = attrs.get("rpassword") if password != rpassword: # 驗證手機號碼是否已經被註冊 raise serializers.ValidationError("對不起,確認密碼與密碼不一致!") return attrs def create(self, validated_data): """儲存使用者資訊""" mobile = validated_data.get("mobile") username = validated_data.get("username") email = validated_data.get("email") validated_data.pop("rpassword") # 移除不需要的資料 # 對密碼進行加密 raw_password = validated_data.get("password") hash_password = make_password(raw_password) # 呼叫序列化器提供的create方法 user = User.objects.create( mobile=mobile, username=username, password=hash_password, email=email ) return user
這個程式碼就是我與其他的博主不同的地方,我看網上的up主就是把驗證的程式碼寫在validate
中,但是這裡存在的一個問題就是所有的錯誤都是統一一起打包返回,無法在前端中做對應欄位的錯誤提示.
userviews
程式碼:
from rest_framework.generics import CreateAPIView from user.models import User from user.serializers import UserSerializer # Create your views here. class UserViewSets(CreateAPIView): queryset = User.objects.all() serializer_class = UserSerializer
從測試結果就可以看出,針對不同的欄位,會返回對應的錯誤,而不是一起返回的.
到此這篇關於Django drf使用Django自帶的使用者系統的註冊功能 的文章就介紹到這了,更多相關Django drf使用者系統註冊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45