Django自带的User模型没有头像和电话这两项属性,因此需要通过扩展User达到我们想要的效果,根据官方的文档,扩展新字段到User只需要用one-to-one模型即可。


一、创建一个APP

pythonmanage.pystartappCustomUser


二、在models里面创建用户模型,使用one-to-one关联User

from__future__importunicode_literalsfromdjango.dbimportmodels#Createyourmodelshere.fromdjango.contrib.auth.modelsimportUserclassMyUser(models.Model):user=models.OneToOneField(User)phone=models.CharField(max_length=20,null=True,blank=True)avatar=models.ImageField(upload_to='photo',null=True,blank=True)


三、增加admin配置,admin后台可以填写这两个新字段:

fromdjango.contribimportadminfromdjango.contrib.auth.adminimportUserAdminfromdjango.contrib.auth.modelsimportUserfromCustomUser.modelsimportMyUser#DefineaninlineadmindescriptorforEmployeemodel#whichactsabitlikeasingletonclassEmployeeInline(admin.StackedInline):model=MyUsercan_delete=Falseverbose_name_plural='myuser'#DefineanewUseradminclassUserAdmin(UserAdmin):inlines=(EmployeeInline,)#Re-registerUserAdminadmin.site.unregister(User)admin.site.register(User,UserAdmin)

admin后台效果:



四、修改settings User指向:

AUTH_PROFILE_MODULE='CustomUser.MyUser'


五、生成数据库:

pythonmanage.pymakemigrationsCustomUserpythonmanage.pymigrations


六、上传头像需要media配置,故settings需增加配置:

MEDIA_URL='/media/'MEDIA_ROOT=os.path.join(BASE_DIR,'media')

在manage.py同一层新建media目录


七、配置urls.py:

fromdjango.confimportsettingsfromdjango.conf.urls.staticimportstaticurlpatterns+=static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)


八、template上使用头像:

<ulclass="navnavbar-navnavbar-right"><liclass="dropdownnavbar-user"><ahref="javascript:;"class="dropdown-toggle"data-toggle="dropdown"><imgsrc="{{request.user.myuser.avatar.url}}"alt=""/><spanclass="hidden-xs">{{request.user.username}}</span><bclass="caret"></b></a><ulclass="dropdown-menuanimatedfadeInLeft"><liclass="arrow"></li><li><ahref="javascript:;">编辑资料</a></li><li><ahref="javascript:;">重置密码</a></li><liclass="divider"></li><li><ahref="{{url('logout')}}">退出系统</a></li></ul></li></ul>