前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Django使用自己的用户系统

Django使用自己的用户系统

作者头像
星哥玩云
发布于 2022-06-30 12:16:39
发布于 2022-06-30 12:16:39
6420
举报
文章被收录于专栏:开源部署开源部署

用过django的人应该都会知道admin,不过,需求是多变的,比如,你有一个变态的用户系统,用户可能有大中小三张头像,除了fisrt name ,last name外还有middle name,T^T name巴拉巴拉,django 的用户系统可能满足不了你的需求,这时候需要用自己的用户系统了,如何能在满足需求的时候充分又利用到django的用户系统?

django使用自己的用户系统 step-1 写自己的auth模块(定义user class) step-2 admin.py 注册到django的admin后台,并且修改一些field step-3 修改settings.py中相应配置

django使用自己的用户系统 用过django的人应该都会知道admin,什么,真的没用过?汗,如果这样的话先看看这个 https://docs.djangoproject.com/en/1.6/ref/contrib/admin/

django自带用户系统,通过上面的admin,以及auth可以方便的管理用户。

不过,需求是多变的,比如,你有一个变态的用户系统,用户可能有大中小三张头像, 除了fisrt name ,last name外还有middle name,T^T name巴拉巴拉,django 的用户系统可能满足不了你的需求,这时候需要用自己的用户系统了,如何能在满足 需求的时候充分又利用到django的用户系统?

官方文档如下,内有详细说明,有英文厌烦症的可以直接略过 https://docs.djangoproject.com/en/dev/topics/auth/customizing/

其实步骤很简单

写自己的auth模块(定义user class); admin.py 注册到django的admin后台,并且修改一些field 修改settings.py中相应配置 step-1 写自己的auth模块(定义user class) 新建一个模块,名字随意,假设叫做myauth

User class继承AbstractBaseUser,UserManager继承BaseUserManager 重写对应的方法,建议浏览下AbstractBaseUser, BaseUserManager的源码

User类不用说,也就是根据自己业务定义的用户class,Manager就是django中 的Manager,做的事情你肯定经常用到,obj.objects.filter(),其中的objects 就是Manager,文档如下 https://docs.djangoproject.com/en/dev/topics/db/managers/

code

# -*- coding: utf-8 -*- from django.db import models from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser)

class UserManager(BaseUserManager):

    def create_user(self, name, email, password=None):

        if not email:             raise ValueError('Users must have an email address')

        user = self.model(             name=name,             email=UserManager.normalize_email(email),         )

        user.set_password(password)         user.save(using=self._db)         return user

    def create_superuser(self, name, email, password=None):

        user = self.create_user(name, email, password)         user.is_admin = True         user.save(using=self._db)         return user

class User(AbstractBaseUser):     '''用户表'''

    name = models.CharField(max_length=100, unique=True)     email = models.EmailField(max_length=100, unique=True)     avatar = models.URLField(blank=True)     created_at = models.DateTimeField(auto_now_add=True)     updated_at = models.DateTimeField(auto_now=True)     is_delete = models.BooleanField(default=False)     is_active = models.BooleanField(default=True)     is_admin = models.BooleanField(default=False)     access_token = models.CharField(max_length=100, blank=True)     refresh_token = models.CharField(max_length=100, blank=True)     expires_in = models.BigIntegerField(max_length=100, default=0)

    objects = UserManager()

    USERNAME_FIELD = 'name'     REQUIRED_FIELDS = ('email',)

    class Meta:         ordering = ('-created_at',)

    def __unicode__(self):         return self.name

    def get_full_name(self):         return self.email

    def get_short_name(self):         return self.name

    def has_perm(self, perm, obj=None):         return True

    def has_module_perms(self, app_label):         return True

    @property     def is_staff(self):         return self.is_admin

重写的字段看下源码就可以解释到了:

1. AbstractBaseUser已经有password, last_login,所以密码这些就不用费心了 2. 由于get_username用到了self.USERNAME_FIELD,所以需要指明哪个字段为用户名 3. get_short_name,get_full_name需要实现,否则会抛异常 4. 其他就按照自己的业务来写即可 5. UserManager重写下两个create方法

class AbstractBaseUser(models.Model):     password = models.CharField(_('password'), max_length=128)     last_login = models.DateTimeField(_('last login'), default=timezone.now)

    is_active = True

    REQUIRED_FIELDS = []

    class Meta:         abstract = True

    def get_username(self):         "Return the identifying username for this User"         return getattr(self, self.USERNAME_FIELD)

    def __str__(self):         return self.get_username()

    def natural_key(self):         return (self.get_username(),)

    def is_anonymous(self):         """         Always returns False. This is a way of comparing User objects to         anonymous users.         """         return False

    def is_authenticated(self):         """         Always return True. This is a way to tell if the user has been         authenticated in templates.         """         return True

    def set_password(self, raw_password):         self.password = make_password(raw_password)

    def check_password(self, raw_password):         """         Returns a boolean of whether the raw_password was correct. Handles         hashing formats behind the scenes.         """         def setter(raw_password):             self.set_password(raw_password)             self.save(update_fields=["password"])         return check_password(raw_password, self.password, setter)

    def set_unusable_password(self):         # Sets a value that will never be a valid hash         self.password = make_password(None)

    def has_usable_password(self):         return is_password_usable(self.password)

    def get_full_name(self):         raise NotImplementedError()

    def get_short_name(self):         raise NotImplementedError()

step-2 admin.py 注册到django的admin后台,并且修改一些field admin注册user,参考文档 https://docs.djangoproject.com/en/dev/ref/contrib/admin/ 代码如下,感觉没什么需要说明的。

myauth/admin.py

#coding: utf-8

from django import forms from django.contrib import admin from django.contrib.auth.models import Group as DjangoGroup from django.contrib.auth.admin import UserAdmin from django.contrib.auth.forms import ReadOnlyPasswordHashField

from myauth.models import User

# 新增用户表单 class UserCreateForm(forms.ModelForm):     """A form for creating new users. Includes all the required     fields, plus a repeated password."""     password1 = forms.CharField(label='Password', widget=forms.PasswordInput)     password2 = forms.CharField(         label='Password confirmation',         widget=forms.PasswordInput,     )

    class Meta:         model = User         fields = ('name', 'email')

    def clean_password2(self):         # Check that the two password entries match         password1 = self.cleaned_data.get("password1")         password2 = self.cleaned_data.get("password2")         if password1 and password2 and password1 != password2:             raise forms.ValidationError("Passwords don't match")         return password2

    def save(self, commit=True):         # Save the provided password in hashed format         user = super(UserCreateForm, self).save(commit=False)         user.set_password(self.cleaned_data["password1"])         if commit:             user.save()         return user

# 修改用户表单 class UserChangeForm(forms.ModelForm):     """A form for updating users. Includes all the fields on     the user, but replaces the password field with admin's     password hash display field.     """     password = ReadOnlyPasswordHashField()

    class Meta:         model = User

    def clean_password(self):         # Regardless of what the user provides, return the initial value.         # This is done here, rather than on the field, because the         # field does not have access to the initial value         return self.initial["password"]

# 注册用户 class MyUserAdmin(UserAdmin):

    form = UserChangeForm     add_form = UserCreateForm

    list_display = ('name', 'created_at', 'email', 'is_delete', 'is_admin')     search_fields = ('name', 'email')     list_filter = ('is_admin',)     readonly_fields = ('created_at', 'updated_at')     fieldsets = (         (None, {'fields': ('name', 'email', 'password', 'avatar',)}),         ('Personal info', {'fields': ('created_at', 'updated_at')}),         (             'Open token info',             {                 'fields': ('access_token', 'refresh_token', 'expires_in')             }         ),         ('Permissions', {'fields': ('is_delete', 'is_admin', 'is_active')}),         ('Important dates', {'fields': ('last_login',)}),     )     add_fieldsets = (         (             None,             {                 'classes': ('wide',),                 'fields': ('name', 'email', 'password1', 'password2'),             }         ),     )     ordering = ('created_at',)     filter_horizontal = ()

admin.site.register(User, MyUserAdmin)

step-3 修改settings.py中相应配置 添加 AUTH_USER_MODEL = 'myauth.User' install_app不要忘记加上myauth模块

grep django的源码可以看到,很多地方直接使用了配置AUTH_USER_MODEL

user = models.ForeignKey(settings.AUTH_USER_MODEL)

def get_user_model():     """     Returns the User model that is active in this project.     """     from django.db.models import get_model

    try:         app_label, model_name = settings.AUTH_USER_MODEL.split('.')     except ValueError:         raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'")     user_model = get_model(app_label, model_name)     if user_model is None:         raise ImproperlyConfigured("AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL)     return user_model

ps: django admin更改主题,django admin的主题实在是太朴素了 https://riccardo.forina.me/bootstrap-your-django-admin-in-3-minutes/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
google scholar_google
DOI全称为Digital Object Unique Identifier,即数字对象唯一标识符,通俗一点来讲,DOI就是一篇文献的身份证
全栈程序员站长
2022/11/10
6680
论文人必看!Deepseek保姆级指令
在撰写论文的过程中,规范的格式和清晰的结构是保证论文质量的关键。今天将为大家分享一份高效且专业的论文撰写指令模板,帮助你更好地组织论文内容,确保格式规范,从而提升论文的整体质量和学术水平。
用户11203141
2025/03/24
2010
论文人必看!Deepseek保姆级指令
导师:顶尖学者都在用的ChatGPT论文选题指令!让你的研究主题脱颖而出
接下来,我将详细阐述这一模型的各个组成部分,并提供具体的ChatGPT指令示例,以便您能直接应用于自己的研究实践中。
用户11203141
2025/03/06
1300
导师:顶尖学者都在用的ChatGPT论文选题指令!让你的研究主题脱颖而出
惊呆了!这篇论文全文都是脏话,可编辑部居然对它评价极佳并发表了!
一教授为了抗议三流科学杂志发送垃圾邮件,回复了一篇全文只重复七个脏话字眼的论文,可没想到的是,它竟然还被 出!版!了!
zenRRan
2023/01/07
5660
惊呆了!这篇论文全文都是脏话,可编辑部居然对它评价极佳并发表了!
自己一些思考 | 人工智能学硕 研究生阶段的学习规划
不断提高自己信息检索与利用,独立解决问题能力: 学术搜索:谷歌学术、AMiner、PubMed、Semantic Scholar、百度学术、SCI-Hub等 arXiv、The latest in Machine Learning | Papers With Code,DBLP、Web of Science 、领研、以及经典论文的 related work & cited by 搜索引擎:谷歌、必应、SearXNG以及一些聚合搜索等 学校买了的一些专业数据库,以及专业方向有关的好的期刊、会议。公众号媒体等
叶庭云
2022/06/05
8370
导师:利用ChatGPT这样写文献综述,轻松发SCI
研究问题是文献综述的核心,它不仅指导研究方向,还决定了需要从文献中提取的关键信息。定义研究问题时,应力求明确、具体,并涵盖您所关注的主题。
用户11203141
2025/03/06
1060
导师:利用ChatGPT这样写文献综述,轻松发SCI
拯救Sci-Hub的「最后行动」:把77TB论文,转化成850个BT种子传播下去
在出版商的重重压力之下,「知识开源领域」的著名网站 Sci-Hub 停更已有半年了。
机器之心
2021/06/08
1.4K0
免费下载中英文文献,这些强大的方法不容错过
(很多文章中都推荐各种杂七杂八的网站,但就小编的个人经验,最好是2~3个功能强大的途径就行了,毕竟科研狗平时也没有那么多的脑子用在记各种网址上......)
百味科研芝士
2019/05/23
3.1K0
如何有效提高你的科研工作效率
工欲善其事,必先利其器。充分发挥每个工具的优势可以显著提高我们的工作效率。为了更好的工作和科研,今天给大家介绍一些提高效率的工具。
郭好奇同学
2023/02/15
1.7K1
如何有效提高你的科研工作效率
惊呆了!这篇论文全文都是脏话,可编辑部居然对它评价极佳并发表了!
科研猫后台回复「期刊名称」便可获得想要查询的期刊详情,含影响因子、JCR/中科院分区、出版周期、发文量、预警等级、自引率等。
用户6317549
2022/10/31
4380
惊呆了!这篇论文全文都是脏话,可编辑部居然对它评价极佳并发表了!
分享一些实用的在线网站(免费)
该图片由Coffee Bean在Pixabay上发布 受到公众号「曾少贤」的启发,自己也整理了一些我在生活中经常使用到的在线网站,涉及的领域有图片、设计、文档、编程、学习等方面,这里分享出来,希望可以
出其东门
2019/07/19
4.9K0
分享一些实用的在线网站(免费)
分享几种论文写作神器,提高你的写作效率
Zotero作为一款协助科研工作者收集、管理以及引用研究资源的免费软件,如今已被广泛使用。此篇使用说明主要分享引用研究资源功能,其中研究资源可以包括期刊、书籍等各类文献和网页、图片等。欢迎所有共同学习使用的朋友提供批评意见或补充使用经验。
黄博的机器学习圈子
2020/04/21
2.6K0
分享几种论文写作神器,提高你的写作效率
分享一些做课题调查的方法
拿到一个新的研究课题时,可以先去知网之类的地方搜索一些国内硕博士的毕业论文,通过他们的论文可以先对课题有一个初步的认知。但是再往后就建议选择在google scholar上搜索一些外文论文了,当然这里不是随便乱搜索,而是要找领域内的知名期刊、会议论文来看,那么如何知道什么样的期刊、会议是优秀的期刊、会议呢?有两种途径:
灰度五十
2022/03/08
5950
分享一些做课题调查的方法
写综述的用词云真的不香吗?python词云图制做
在综述文章里,难道不要统计文献情况吗?统计的文献情况关键词那么多,难道用词云它不香吗!!!!!!!!!?
一个有趣的灵魂W
2020/09/15
1.1K0
写综述的用词云真的不香吗?python词云图制做
为全人类知识平等,她缔造了学术圈小黄网,6000万种子免费下
“世有不公之法,我们是要安于循守,还是且改且守、待其功成?或是即刻起而破之?” —— 梭罗 1849 2017年6月,美国纽约地方法院宣判了一起版权侵权案件,原告是全世界最大的学术出版集团爱思唯尔(Elsevier),被告则是一家名为 Sci-hub(以下简称 Sci) 的网站。 起诉事由非常简单:Sci 盗取原告以及其他多家出版商的付费论文资源,放在网上供人免费下载。 法院最终判决 Sci 需支付出版商 Elsevier 集团1500万美元赔偿,同时要求网络服务商封杀 Sci的域名。 看起来这是一个很
企鹅号小编
2018/01/12
3.1K0
为全人类知识平等,她缔造了学术圈小黄网,6000万种子免费下
10万引大佬分享「写论文10大技巧」,连怎么沟通审稿人都提到了 | 科研党福利
一位堪称“NS论文收割机”的学术大牛,为各位奉上了10点关于写、发论文的锦囊妙计。
量子位
2022/12/09
3440
10万引大佬分享「写论文10大技巧」,连怎么沟通审稿人都提到了 | 科研党福利
在印度展开全球文献数据挖掘,美国专家的大胆做法登上Nature
Carl Malamud 站在服务器前,他的团队准备对 7300 万篇论文进行数据挖掘。
机器之心
2019/07/19
5560
在印度展开全球文献数据挖掘,美国专家的大胆做法登上Nature
干货 | 画论文折线图、曲线图?几个代码模板轻松搞定!
这几天在搞论文图,唉说实话抠图这种东西真能逼死人。坐在电脑前抠上一天越看越丑,最后把自己丑哭了……
短短的路走走停停
2019/11/19
6.1K0
干货 | 画论文折线图、曲线图?几个代码模板轻松搞定!
【数学建模】——【新手小白到国奖选手】——【学习路线】
掌握Python基础是进行数学建模的第一步。Python的易用性和丰富的库使其成为数据科学和数学建模的理想选择。
小李很执着
2024/06/21
1.1K0
【数学建模】——【新手小白到国奖选手】——【学习路线】
Nature评选2016年十大杰出科学人物
大数据文摘作品,转载要求见文末 编译团队|廖远舒,王婷 在追寻世界真相之路上,可能是寂寞的,但不是孤单的。Nature此次评选出2016年度十大杰出人物,他们或来自信息互联网、物理、生物研究等各样不同领域,不过他们却都在做着一件事——用自己的专业知识,探寻心中欲求得的真相。 GABRIELA GONZALEZ:引力间谍 物理学家, 帮助捕获寻求已久的引力波的第一个直接迹象 一年前,Gabriela Gonzalez正在努力保守她生命中最大的秘密。在美国的两个巨型探测器已经捕获到引力波的迹象 ——由爱因斯坦
大数据文摘
2018/05/22
6300
推荐阅读
相关推荐
google scholar_google
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文