Django的入门探索
蜗牛这几天有学了学python,买的书里面用一个Django的教程,蜗牛细细看了看。下面是蜗牛的笔记。
ps:代码不是蜗牛的,蜗牛只是添加了点儿自己的想法和笔记。
首先这是一个制作笔记的网站。
教材上是要安装虚拟环境的,蜗牛前前后后折腾了很久,安装成功了,但是总是会有问题,而且每次都要提前激活环境很是不爽,最后发现不用也没什么问题(至少现在没有碰见什么问题),于是就果断不用了。
安装Django
安装好python之后,利用下面的命令:
pip install Django
之后执行命令:
Django-admin.py startproject learning_log .
一定要注意后面那个点不要忘了。
之后产生一个learning_log的文件夹,里面有几个文件。
其中:
__init__.py这个是包的文件,python包都要用。
settings是配置文件,因为Django的工程是由好几个应用程序组成的,稍后会看到,每个应用程序都会在这里注册
urls:输入一个地址,在这里找到对应的视图函数,就是映射
wsgi:帮助Django提供它创建的文件,Web服务器网关接口
创建数据库
因为蜗牛之前用过flask,也稍微接触过servlet,在蜗牛的印象里面和数据库打交道就是得有SQL语句什么的,忽然发现这个框架不用,有“模型”,之后Django会帮你弄数据库……
执行命令:
python manage.py migrate
我们称修改数据库的操作为“迁移数据库”。
首次执行这个命令Django会创建一个数据库,里面有必要的表。
到这个时候其实就能看到一点成果了,在终端输入:
python manage.py runserver
启动服务器,之后打开浏览器输入127.0.0.1:8000
你就能看见美丽的Django提供的页面。
当然它也说了:现在其实你还啥都没做呢。只是环境稍微搭建起来了。
创建你的应用程序
前面说过一点,Django项目是由一系列的应用程序组成的。
执行下面的命令
python manage.py startapp learning_logs
注意现在是learning_logs,多了个s。
现在就创建了一个app,你可以看见多了一个文件夹,里面有下面的文件:
admin:注册模型用的地方。Django创建的模型不用注册,但是自己的模型要注册
migrations:迁移文件。
views:这个是视图,不过蜗牛总觉得应该叫路由。
还有几个文件,不重要
定义模型
首先就要和数据库打交道。
models.py文件:
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Topic(models.Model):
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return self.text
一个类就是一个模型。
这个模型的属性对应着数据库表中的字段。
有两个字段:text和date_added。
但是这时候只是弄了模型,还没有反应到数据库中。
前面说过,Django自己的模型不用激活但是自己的模型要先激活。
settings.py
这个文件很大,只截取要修改的地方。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'learning_logs',
]
注意最一行,这个就是注册。
模型也写了,也注册了,于是下面就能更新到数据库中了:
也叫迁移数据库:
python manage.py makemigrations learning_logs
上面这个命令是生成一个迁移文件。
python manage.py migrate
这个文件才是真正的迁移数据库。
这时在打开数据库,会发现一个lerning_logs_topic表。
这个表有俩字段,一个是text,一个是date_added
都是套路:
1。定义模型。2。生成迁移文件。3。迁移数据库
这样Django会根据模型的定义创建对应的表。
超级用户
Django有管理网站,但是这个网站只能是超级用户(管理员)使用,普通用户不能登录。
管理员可以看到所有的信息,也就是说管理员能看到个人添加的话题等信息。
创建超级用户:
在终端执行:
python manage.py createsuperuser
会提示数据名字和email和密码。
建立好之后,再次打开数据库,你会发现在auth_user中多了条记录,名字是你自己起的,密码是散列。
那么问题就来了,自己并没有定义user这个模型,那这表是哪里来的呢?
其实user模型Group模型以及另外的一些模型都是Django创建好的。
记住这个用户的id是1,以后要用到。
注册模型:
刚说了,自己定义的模型是要注册的,user等不用
admin.py
其实想想也知道在哪里,模型属于应用程序,那这个admin也就是在models对应的文件夹了。
from django.contrib import admin
# Register your models here.
from learning_logs.models import Topic
admin.site.register(Topic)
这就注册了模型
到目前为止已经可以访问Topic并且能添加Topic了。
这时打开127.0.0.1:8000/admin会看到美丽的页面。
不过这里遗留一个问题:
http://127.0.0.1:8000/admin/learning_logs/topic/
你点击这个会弹到对应的页面,但是并没有配置这个的路由啊?
而且这个链接也可以用:
http://127.0.0.1:8000/admin/learning_logs/topic/1/change/
难道是Django已经做好了?
说实话如果不深入理解框架的话,总有种隔靴搔痒的感觉。
定义模型Entry
Entry就是每个Topic下面的那个条目
同样在models.py下
只写了要修改的部分
class Entry(models.Model):
topic = models.ForeignKey(Topic)
text = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = 'entries'
def __unicode__(self):
return self.text[:50] + "..."
对,写完模型要生成迁移文件,然后迁移数据库。
python manage.py makemigrations learning_logs
python manage.py migrate
上面两步就完成了。
因为已经迁移了数据库,现在在数据库中能看到:learning_logs_entry
这个表
Entry建立了三个字段,topic,text和date_added。
其实Djange是根据model建立数据库的,只是你看不到而已。
在DDL中是这样的:
Table [learning_logs_entry]
Fields: 4
[id]: integer NOT NULL
[text]: text NOT NULL
[date_added]: datetime NOT NULL
[topic_id]: integer NOT NULL
Foreign Keys: 1
[] ([topic_id]) REFERENCES [learning_logs_topic]([id])
Indexes: 2
[] PRIMARY
[id] AUTOINCREMENT
[learning_logs_entry_19b4d727]
[topic_id]
Triggers: 0
Unique constraints: 0
Check constraints: 0
有很多细节被掩藏了。
建立了模型,生成了数据库迁移文件,迁移了数据库,之后要干嘛?
自己建立的模型要注册。
admin.py
from django.contrib import admin
# Register your models here.
from learning_logs.models import Topic, Entry
admin.site.register(Topic)
admin.site.register(Entry)
这时候登录是会看到entry的。不过你要是把superuser忘了,你可以再建立一个,可以多次建立。
但是蜗牛还是忍不住想,这里添加entry会关联到topic。
那这个是怎么实现的?居然不用自己传的么?难道一个外键就搞定了?
还有http://127.0.0.1:8000/admin/learning_logs/entry/这样的网站是谁定义的?
我怎么就不记得定义过这样的网站呢?
不过这时候登录的还是admin管理网站,是不是和这个也有关系?