这做项目时发现django自带的User中的字段不够用,默认的auth_user表总共只有11个字段,如果需要更多的字段该怎么办,在网上搜了一下,有这么几种方法。

1. 直接修改django 源码,修改User class 的定义,以及各种方法等,然后把数据库auth_user表里的字段扩展到与自己需求一致。(源代码在:django.contrib.auth.models import User),这种方式,每次升级django都得很小心。这种不适用于我们这种新手。

2.把django 的user以及认证部分的源代码拷贝到自己的app下面,然后修改,配置,这样就不需要改动django的代码了.但如果你要升级django ,就可能有麻烦。这种也不适用于我们。

3.继承User,做扩展。这种方法有两种方式,一是继承AbstractUser,另一种是继承AbstractBaseUser。自己试了下继承AbstractUser,在syncdb时不再建立auth_user表,而是建立了以你的模块名为表名的表,你只需要在你的Model里增加你需要的字段即可,比如:

 class CustomUser(AbstractUser):
company = models.CharField(max_length=30,default='无',
verbose_name="公司名")

这样会在数据库中建立xxx_customuser表,其中的字段包含了company,还包含了原来的auth_user中的所有字段。然后在setting.py中添加一句AUTH_USER_MODEL = app名.CustomUser'。而且你仍然可以以request.user的方式获得字段的值。

如果你选择继承AbstractBaseUser,那么除了password、last_login和is_active这三个字段外,你需要自己实现你需要的其它字段,根据需要可以使用django的验证方式,也可以自己编写验证后端,这种方式如果处理不好不知道会不会影响运行,目前还没有深入研究。

4.profile 方式扩展。如果只是添加几个无关紧要的字段的话,这种自己感觉灵活又简便,但是,如果用户很多,访问量较大的话,会对系统性能带来影响。如果你是想用email作为验证方式的话,还是得通过继承User来实现,这也是django1.6推荐的方式。

5.不修改django源码也不增加profile表的扩展用户模型。这个大家可以去搜搜。之前看到这个帖子,感觉很激动,确实是好方法啊,但自己怎么也实现不了,原因是里面的第一句和第三句开发环境提示我无效的变量add_to_class和append,不知道是什么原因,索性没去管它,syncdb后数据库中的字段没有增加,自己无能无法实现,也不知道原因。而且还有一个问题,就算能够成功,在admin页面里能不能显示添加的字段呢?希望有人能够帮我解决这个问题,不胜感激!

 User.add_to_class(obj_name, obj)
UserAdmin.fieldsets = list(UserAdmin.fieldsets)
UserAdmin.fieldsets.append((name, {'fields': fields}))

6.使用contribute_to_class这个函数。自己试了一下,比如:

 company_field = models.CharField(max_length=30)
company_field.contribute_to_class(User, 'company')

确实可以直接就在auth_user表中添加这个字段,但是这个字段无法在admin页面显示出来,我想应该还是有办法的,比如修改源代码或者显示的模板,不过最好是不用修改源代码,还是希望有人能够告诉我实现方法,谢谢了。

以上就是本人这两天的一点点收获,最后对user的扩展还是通过使用profile来实现的。

最新文章

  1. MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决
  2. Java 根据经纬度计算两点之间的距离
  3. 常见css水平自适应布局
  4. SUSE zypper failed to work
  5. hdu 1318 Palindromes
  6. 【转载】 ionic 的 下拉刷新 与 上拉加载
  7. 深入浅出OOP(二): 多态和继承(继承)
  8. PAT-乙级-1043. 输出PATest(20)
  9. OS X: Keyboard shortcuts
  10. .net+easyui--combobox
  11. Session里的对象是不可靠的!
  12. Word Search II 解答
  13. [置顶] What is the difference between Category and Class Extension?
  14. iOS 开发问题集锦(一)
  15. php笔记(七)PHP类于对象之多态
  16. 第三章 Python 的容器: 列表、元组、字典与集合
  17. 【收藏】socket 中的 recv与send函数
  18. python开发遇到的坑(2)mongodb安装路径权限问题
  19. django 防止xss攻击标记为安全的二种方法
  20. 状态压缩dp小结

热门文章

  1. 跨站请求伪造 CSRF / XSRF<二:应用>
  2. servlet学习笔记_2
  3. c++ is_space函数
  4. 转!!负载均衡器技术Nginx和F5的优缺点对比
  5. C# 拆箱与装箱 要严格控制,数量多起来严重影响效率
  6. match() vs search()
  7. lamp搭建,thinkphp安装
  8. PE文件学习系列二 DOS头分析
  9. 投影转换(AE)
  10. Win服务器常用批处理脚本