距离上一篇Django第一天已经过去了65天,并不是中间放下了,只是没有想好怎么去写,今天重新开始,希望可以坚持下来。加油!
上一篇环境什么的我们都搭建好了,接下来让我们运行我们第一个程序。
这是我们创建完成后的界面。
我们只需要点击三角就可以运行,或者点击run按钮就可以运行。
然我们运行看看效果。
我们进到网址http://127.0.0.1:8000/ 看看效果。
欢迎你,来到了Django的世界。
之后我们要做什么呢,我们需要创建我们的app。
然后我们只需要输入startapp [appname]
然后我们就可以发现我们多了一个文件夹
为了方便管理我们创建apps文件包,然后拖入到里面。
这一部分做完之后,我们需要将app加入到settings中。
为了方便使用apps,我们将其设置为Source Root
然后在settings中设置
import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
这样我们在加入settings的时候只需要写入users即可。
顺便说一句,创建python package 会比创建directory多以__init__.py的文件。文件夹下面多一个__init__.py文件说明这是一个python包。
现在我们需要先配置我们的数据库。数据库,我们需要在settings中设置。settings中有一个叫做DATABASE的地方。
不难看出,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之类的东西。这说明你的配置出错了,恩,这是个玩笑,恭喜你成功了,我们来看一下数据库。
完成之后,我们会发现多了好多表。
我们来看一下。
让我们来看一下这几个表的用处
- 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.
OK,数据库看完之后,我们就需要正式讲一下UserProfile了。
首先说一下,为什么使用UserProfile,因为有时我们会发现,系统给我们的user表里的字段无法满足我们的需求,比如:user表里没有address,birthday,gender等。如果我们需要,我们就需要创建我们的自己的user。
首先回到我们刚才创建的users app下。里面有一个models.py我们可以将我们需要的model写在里面。
首先呢,我们需要导入头文件。
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。然后完成。
我们来看一下数据库。刷新可以看到我们多了三张表。
打开看一下没问题!OK,UserProfile就写道这里了,下次看看xadmin。