Django学习记录第二天—UserProfile

距离上一篇Django第一天已经过去了65天,并不是中间放下了,只是没有想好怎么去写,今天重新开始,希望可以坚持下来。加油!

上一篇环境什么的我们都搭建好了,接下来让我们运行我们第一个程序。
这是我们创建完成后的界面。

Django学习记录第二天—UserProfile_第1张图片
First Porject.png

我们只需要点击三角就可以运行,或者点击run按钮就可以运行。
然我们运行看看效果。

Django学习记录第二天—UserProfile_第2张图片
run

我们进到网址http://127.0.0.1:8000/ 看看效果。

Django学习记录第二天—UserProfile_第3张图片
127.0.0.1:8000

欢迎你,来到了Django的世界。

之后我们要做什么呢,我们需要创建我们的app。

Django学习记录第二天—UserProfile_第4张图片
run manager

然后我们只需要输入startapp [appname]

Django学习记录第二天—UserProfile_第5张图片
image.png

然后我们就可以发现我们多了一个文件夹

Django学习记录第二天—UserProfile_第6张图片
image.png

为了方便管理我们创建apps文件包,然后拖入到里面。

image.png

这一部分做完之后,我们需要将app加入到settings中。

为了方便使用apps,我们将其设置为Source Root

然后在settings中设置
import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

这样我们在加入settings的时候只需要写入users即可。

Django学习记录第二天—UserProfile_第7张图片
image.png

顺便说一句,创建python package 会比创建directory多以__init__.py的文件。文件夹下面多一个__init__.py文件说明这是一个python包。

现在我们需要先配置我们的数据库。数据库,我们需要在settings中设置。settings中有一个叫做DATABASE的地方。

Django学习记录第二天—UserProfile_第8张图片
mysql settings

不难看出,django默认用的是sqlite3。我们需要改成下面这样,因为我们需要使用mysql。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', #修改成mysql
        'NAME': 'DatabaseName',  #需要连接的数据库的名字
        'USER': ‘USERNAME’,  #安装mysql时的用户名
        'PASSWORD': ‘PWD’, #安装mysql时的密码
        'HOST': '127.0.0.1', #本地
    }
}

提醒一句,在创建数据库时,我们需要注意两个地方,

  • Default Character Set 我们需要使用 utf8
  • Default Collation我们使用utf8_general_ci。

utf8我们不解释了,因为要兼容中文,为什么使用utf8_general_ci文章说 中文的话用utf8_general_ci,如果法语什么的用utf8_unicode_ci,恩,暂且相信吧。

OK,这样我们的数据库算是配置完成了,是不是很方便,接下来我们执行以下makemigrations.
如果你这里报一个mysql的问题,like this

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named MySQLdb

你需要回到你的虚拟环境,安装一个MySQL-python

pip install MySQL-python

安装完之后应该就没有问题了。
然后我们执行migrate,然后你会发现,蹦出来好多英文 还带着0001之类的东西。这说明你的配置出错了,恩,这是个玩笑,恭喜你成功了,我们来看一下数据库。
完成之后,我们会发现多了好多表。
我们来看一下。

Django学习记录第二天—UserProfile_第9张图片
image.png

让我们来看一下这几个表的用处

  • auth_group 暂时未知,预测是用来用户分组用的 表内的id与name应该是用户id 与用户名
  • auth_group_permissions 暂时未知 猜测是用户组权限
  • auth_permission 这里面放的是所有的权限
  • auth_user 这里面放的是用户信息,点开我们也可以看到,有username password等字段
  • auth_user_gourps 这里用户与用户组的关系
  • auth_user_user_permissions 每个用于拥有的权限
  • django_admin_log 与 django_content_type暂时不说
  • django_migrations 这里存放的是所有的连接操作
  • django_session 这个就厉害了,这里存放的用户登录需要的session,都会放在这里面。

接下来做什么呢,我们需要创建我们的超级用户。
依然,进入到我们的manager.py Task里面,执行

createsuperuser #填写你的username Email Password即可

创建完成后,我们可以来django的后天看一下。
来到http://127.0.0.1:8000/admin/ 输入刚才的username 与 password我们就可以进入后台了,like this.

Django学习记录第二天—UserProfile_第10张图片
image.png

OK,数据库看完之后,我们就需要正式讲一下UserProfile了。
首先说一下,为什么使用UserProfile,因为有时我们会发现,系统给我们的user表里的字段无法满足我们的需求,比如:user表里没有address,birthday,gender等。如果我们需要,我们就需要创建我们的自己的user。

首先回到我们刚才创建的users app下。里面有一个models.py我们可以将我们需要的model写在里面。

Django学习记录第二天—UserProfile_第11张图片
image.png

首先呢,我们需要导入头文件。

from django.contrib.auth.models import AbstractUser

为什么我们需要导入AbstractUser呢,我们看一下User类就会发现。

class User(AbstractUser):
    """
    Users within the Django authentication system are represented by this
    model.

    Username, password and email are required. Other fields are optional.
    """
    class Meta(AbstractUser.Meta):
        swappable = 'AUTH_USER_MODEL'

Django自带的User就是继承自这个类。
然后来重写我们自己的类

class UserProfile(AbstractUser):
    nick_name = models.CharField(max_length=50, verbose_name=u'昵称', blank=True, null=True)
    birthday = models.DateField(verbose_name=u'生日', blank=True, null=True)
    address = models.CharField(max_length=100, verbose_name=u'地址', blank=True, null=True)
    age = models.IntegerField(verbose_name=u'年龄', blank=True, null=True)
    gender = models.CharField(max_length=10, choices=(('Female', u'女'), ('Male', '男')), verbose_name=u'性别', default='Male')
    image = models.ImageField(upload_to='images/%Y/%m', verbose_name=u'头像')
    
    class Meta:
        verbose_name = u'用户信息'
        verbose_name_plural = verbose_name

    def __unicode__(self):
        return self.username

这里有几点说明

  • CharField max_length必须填写
  • choices的使用
  • blank=True, null=True 是设置允许为空
  • class Meta设置的是user里表的显示名称
  • __unicode__(self)设置的创建后显示的内容,py3是__str__(self)

关于更多Field设置可以来这里

依然,进入到我们的manager.py Task里面,执行

makemigrations users

这里你可能会遇到这个问题

ERRORS:
users.UserProfile.image: (fields.E210) Cannot use ImageField because Pillow is not installed.
    HINT: Get Pillow at https://pypi.python.org/pypi/Pillow or run command "pip install Pillow".

这时候我们需要安装一个叫做Pillow的包

pip install Pillow

之后我们再来执行。
然后你可能会发现这样一个问题。

users.UserProfile.user_permissions: (fields.E304) Reverse accessor for 'UserProfile.user_permissions' clashes with reverse accessor for 'User.user_permissions'.
    HINT: Add or change a related_name argument to the definition for 'UserProfile.user_permissions' or 'User.user_permissions'.

你需要在settings中添加这么一句话。

AUTH_USER_MODEL = 'users.UserProfile'

再来执行看看。
bingo, 成功。然后执行

migrate users

我们需要输入一个yes。然后完成。

我们来看一下数据库。刷新可以看到我们多了三张表。

Django学习记录第二天—UserProfile_第12张图片
image.png

打开看一下没问题!OK,UserProfile就写道这里了,下次看看xadmin。

我的学习总结,争取坚持30天

你可能感兴趣的:(Django学习记录第二天—UserProfile)