Django1.5自定义User模型

news/2024/9/28 11:02:57/

#Django1.5自定义User模型
Django1.5自定义用户profile可谓简单很多,编写自己的model类MyUser,MyUser至少要满足如下要求:

  1. 必须有一个整型的主键
  2. 有一个唯一性约束字段,比如username或者email,用来做用户认证
  3. 提供一种方法以“short”和“long"的形式显示user,换种说法就是要实现
    get_full_name和get_short_name方法。

###一:在project中创建一个account app

django-admin startapp account

###二:自定义MyUser

实现自定义User模型最简单的方式就是继承AbstractBaseUser,AbstractBaseUser实现了User的核心功能,你只需对一些额外的细节进行实现就可以了。可以看看AbstractBaseUser的源码:

@python_2_unicode_compatible
class AbstractBaseUser(models.Model):password = models.CharField(_('password'), max_length=128)last_login = models.DateTimeField(_('last login'), default=timezone.now)is_active = TrueREQUIRED_FIELDS = []class Meta:abstract = Truedef 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 toanonymous users."""return Falsedef is_authenticated(self):"""Always return True. This is a way to tell if the user has beenauthenticated in templates."""return Truedef 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. Handleshashing 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 hashself.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()

AbstractBaseUser只有get_full_name和get_short_name方法没有实现了。接下来我们就通过继承AbstractBaseUser来自定义User模型叫MyUser:

class MyUser(AbstractBaseUser, PermissionsMixin):username = models.CharField('username', max_length=30, unique=True,db_index=True)email = models.EmailField('email address',max_length=254, unique=True)date_of_birth = models.DateField('date of birth', blank=True, null=True)USERNAME_FIELD = 'email'REQUIRED_FIELDS = ['username']is_staff = models.BooleanField('staff status', default=False,help_text='Designates whether the user can log into this admin ''site.')is_active = models.BooleanField('active', default=True,help_text='Designates whether this user should be treated as ''active. Unselect this instead of deleting accounts.')def get_full_name(self):full_name = '%s %s' % (self.first_name, self.last_name)return full_name.strip()def get_short_name(self):return self.first_nameobjects = MyUserManager()
  • USERNAME_FIELD :作为用户登录认证用的字段,可以usename,或者email等,但必须是唯一的。
  • REQUIRED_FIELDS :使用createsuperuser命令创建超级用户时提示操作者输入的字段
  • is_staff :判断用户是否可以登录管理后台
  • is_active :判断用户是否可以正常登录

###三:自定义MyUserManager
同时要为MyUser自定义个一个manager,通过继承BaseUserManager,提供creat_user和create_superuser方法。

class MyUserManager(BaseUserManager):def create_user(self, username, email=None, password=None, **extra_fields):now = timezone.now()if not email:raise ValueError('The given email must be set')email = UserManager.normalize_email(email)user = self.model(username=username, email=email,is_staff=False, is_active=True, is_superuser=False,last_login=now, **extra_fields)user.set_password(password)user.save(using=self._db)return userdef create_superuser(self, username, email, password, **extra_fields):u = self.create_user(username, email, password, **extra_fields)u.is_staff = Trueu.is_active = Trueu.is_superuser = Trueu.save(using=self._db)return u

###四:指定AUTH_USER_MODEL

覆盖默认的AUTH_USER_MODEL,在settings.py文件中增加:

AUTH_USER_MODEL = 'user.MyUser'

###五:注册MyUser

在account模块下创建admin.py,添加如下代码把MyUser模型注册到admin中:

from django.contrib import admin
from user.models import MyUser
admin.site.register(MyUser)

总结:实现自定义的User模型在Django1.5足够简单方便,根据自己需求继承AbstractBaseUser就可以了。当然如果你想了解更多关于Django 自定义用户模型相关内容,官方文档告诉你更多更好的完好

###使用Django admin模块,必须:

  1. 添加django.contrib.adminINSTALLED_APPS
  2. admin依赖的app包括:django.contrib.auth,django.contrib.contenttypes,django.contrib.messagesdjango.contrib.sessions
  3. 添加django.contrib.messages.context_processors.messsagsTEMPLATE_CONTEXT_PROCESSORS
  4. 添加django.contrib.auth.middleware.AuthenticateionMiddlewaredjango.contrib.messages.middleware.MessageMiddleware,到MIDDLEWARE_CLASS

###ModelAdmin.actions

自定义action函数和普通函数没啥区别,需要是三个参数:当前的 ModelAdmin,当前的HttpRequest,用户说选中的QuerySet

def make_publiced(modleadmin,request,queryset):queryset.update(public=False)

直接调用queryset的update比逐个迭代entity更高效。默认action的下拉列表显示的名字就是函数名make_publiced,但是你可以起一个更优雅的名字:

make_publiced.short_description = u"标记为公开"

最后一步就是告诉modelaction

actions = ['make_publiced']

以上就是你需要做的全部
https://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/

如果你有什么建议和问题欢迎留言。


http://www.ppmy.cn/news/1531129.html

相关文章

CSS布局中的定位

一、position 1.static position: static; 默认值,没有定位2 .relative 相对定位:相对自身原来的位置进行偏移 偏移设置:top、left、right、bottom 相对定位元素的规律: 设置相对定位的盒子会相对于它原来的位置,通…

Java Stream流编程入门

流式编程 stream流式编程分为 首先转化为stream中间函数的链接最后的终结函数 怎么转化为stream 单列集合 List<String> list new ArrayList<String>(); Collections.addAll(list,"1","2","3","4","5","…

智能手机取证: 专家如何从被锁定设备中提取数据?

在数字取证领域&#xff0c;从被锁定的手机中检索数据的能力是决定调查成功与否的关键技能。由于智能手机往往是解决复杂案件的关键&#xff0c;智能手机取证已经成为打击犯罪和恐怖主义战争中的一个关键组成部分。通话记录、短信、电子邮件&#xff0c;甚至位置数据都可能被发…

golang如何把微信支付结构体拼接为对参数按照key=value的格式,并按照参数名ASCII字典序排序

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…

Django Web开发基础介绍

概述 Django 是后端Python的 Web 开发框架&#xff0c;主要任务是处理与服务器和数据库相关的事务&#xff0c;模板渲染动态生成网页内容只是其中一部分。 Django 内置了的模板引擎&#xff0c;可以将 HTML 页面与 Python 代码进行分离。模板引擎提供了丰富的模板标签和过滤器…

大数据新视界 --大数据大厂之HBase 在大数据存储中的应用与表结构设计

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

python是什么语言写的

Python是一种计算机程序设计语言。是一种面向对象的动态类型语言。现今Python语言很火&#xff0c;可有人提问&#xff0c;这么火的语言它的底层又是什么语言编写的呢&#xff1f; python是C语言编写的&#xff0c;它有很多包也是用C语言写的。 所以说&#xff0c;C语言还是很…

使用python爬取豆瓣网站?如何简单的爬取豆瓣网站?

1.对python爬虫的看法 首先说说我对python的看法&#xff0c;我的专业是大数据&#xff0c;我从事的工作是java开发&#xff0c;但是在工作之余&#xff0c;我对python又很感兴趣&#xff0c;因为我觉得python是一门很好的语言&#xff0c;第一&#xff1a;它可以用来爬取数据…