当我们想用到Django自带的自带的用户验证系统,但是django自带的user表又无法完全满足我们的需求时,我们可以考虑扩展django自带的user表

1.扩展django自带用户模型的方法

1、和用户模型一对一链接

标准的Django模型都会有自己的数据库表,并通过OneToOneField与现有用户模型形成一对一的关联。

2、基于扩展AbstractBaseUser来创建的自定义用户模型

在models.py中,我们需要导入AbstractUser模块,并自定义我们自己的表模型,让我们的自定义的表继承AbstractUser

在settings中,我们需要进行设置,AUTH_USER_MODEL = "app01.UserInfo"

[app01/models.py]

from
django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): '''用户信息''' nid = models.BigAutoField(primary_key=True) nickname = models.CharField(verbose_name='昵称', max_length=32) email = models.EmailField(verbose_name='邮箱') tel = models.CharField(verbose_name='手机号码', max_length=11, unique=True, null=True, blank=True) #blank指admin里可以不输入值,null指数据库里可以为空 avatar = models.FileField(verbose_name='头像', upload_to='avatar/', default="avatar/default.png") create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) # mutual_fans = models.ManyToManyField(verbose_name='互粉', to='Article', blank=True) def __str__(self):  #不定义此方法则,默认打印对象 return self.username class Meta:  #在admin里显示的表名 verbose_name_plural = '用户详情表'

 

会生成一个UserInfo表,其中包含Django自带user表里所有的字段以及我们自己写的字段(由于我们指定了主键nid,所以不会生成id字段)

这样我们就可以使用django自带的用户认证系统

我们保存到数据库中的密码是要经过加密的,且加密模式要与django一样,这样注册的用户才能通过auth.authenticate认证,所有创建新用户时

#方法一:通过create_user方法创建用户,(推荐此方法)
      from django.contrib import auth
user_obj=models.UserInfo.objects.create_user(username=username,password=password,email=email,avatar=avatar_img,nickname=username) #方法二:采用相同的加密方式,将密码转换后,也可直接用普通的创建方式 from django.contrib.auth.hashers import make_password password = make_password(request.POST.get('password')) user_obj=models.UserInfo.objects.create(username=username,password=password,email=email,avatar=avatar_img,nickname=username)

 

一般查询多于多于修改创建,所以为了避免跨表查询,比如评论数等可以写在article表内,用来存储数据,方便查询

 

 DateTimeField字段设置

自动获取时间并可更改 点击查看 

 

media静态文件配置

Django settings.py 的media路径设置
2013年08月28日 ⁄ 综合 ⁄ 共 1092字    ⁄ 字号 小 中 大 ⁄ 评论关闭
在一个 models 中使用 FileField 或 ImageField 需要以下步骤:

1. 在你的 settings 文件中, 定义一个完整路径给MEDIA_ROOT 以便让 Django在此处保存上传文件. (出于性能考虑,这些文件并不保存到数据库.) 定义MEDIA_URL 作为该目录的公共 URL. 要确保该目录对 WEB 服务器用户帐号是可写的.

2. 在你的 models.py 中添加 FileField 或 ImageField, 并确保定义了upload_to 选项,以告诉 Django 使用MEDIA_ROOT 的哪个子目录保存上传文件.

3. 你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT). 要想得到这个文件的路径可以用.url方法。例如,如果models里有一个取名为"photo"的ImageField,可以在Html模板里通过{{object.photo.url}}得到该图片的路径。

settings.py 设置

媒体文件的绝对路径:
# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"   
MEDIA_ROOT = 'D:/Python26/Lib/site-packages/django/bin/newproj/media'

媒体文件的相对路径:
# URL that handles the media served from MEDIA_ROOT.
# Example: "http://media.lawrence.com"
MEDIA_URL = '/site_media/' 

设置静态文件路径
STATIC_PATH = 'D:/Python26/Lib/site-packages/django/bin/newproj/media'


urls.py 影射路径

(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.STATIC_PATH}),
将 MEDIA_URL 的site_media 影射到 settings.STATIC_PATH

models.py 上传图片字段设置

photo = models.ImageField('上传图片',upload_to='photos')
相当于传到 D:/Python26/Lib/site-packages/django/bin/newproj/media/photos 目录下,浏览时通过/site_media/photos/ 访问。
帮助理解

相关文章:

  • 2021-09-25
  • 2021-08-31
  • 2021-06-10
  • 2021-10-02
  • 2021-07-27
  • 2021-07-06
  • 2021-07-03
  • 2021-10-14
猜你喜欢
  • 2021-06-18
  • 2021-07-28
  • 2021-12-06
  • 2021-10-03
  • 2021-11-18
  • 2022-01-03
  • 2021-11-27
相关资源
相似解决方案