安装django
pip install django==2.0
python -m django --version
创建一个项目
django-admin startproject mysite
进入项目目录,创建一个应用(app)
python manage.py startapp news
项目和应用有啥区别?
应用是一个专门做某件事的一个系统——比如新浪网站是一个项目,新浪博客是一个应用app。项目则是一个网站使用的配置和应用的集合。项目可以包含很多个应用。应用可以被很多个项目使用。
查看目录结构:
[root@ansible] /tmp$ tree mysite/
mysite/
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ └── settings.cpython-36.pyc
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── news
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│ └── __init__.py
├── models.py
├── templates
│ ├── news
│ └── year_archive.html
├── tests.py
└── views.py
目录说明:
最外层的mysite/
只是装载你项目的一个容器, Django 不关心它的名字,你可以将它重命名为任何你喜欢的名字。
manage.py
: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
里层的mysite/
: 包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。 (比如 mysite.urls).
mysite/__init__.py
: 一个空文件,正是由于这个文件,Python 这个目录被认为是一个 Python 包。如果你是 Python 初学者,阅读官方文档中的 更多关于包的知识。
mysite/settings.py
:项目的配置文件。比如 DEBUG 的开关,静态文件的位置,定义可以访问django网站的IP ,网站的域名 ,数据库的设置 等。
mysite/wsgi.py
: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
mysite/urls.py
: 网址入口,将 URL 路径映射到对应的views.py中的一个函数(或者generic类),访问网址就对应一个函数
from django.urls import path
from . import views
urlpatterns = [
path('articles//', views.year_archive),
path('articles///', views.month_archive),
path('articles////', views.article_detail),
]
路径字符串使用参数标签从URL中“捕获”相应值。当用户请求页面时,Django 依次遍历路径,直至初次匹配到了请求的 URL。(如果无匹配项,Django 会调用 404 视图。) 这个过程非常快,因为路径在加载时就编译成了正则表达式。
一旦有 URL 路径匹配成功,Django 会调用相应的视图函数。每个视图函数会接受一个请求对象——包含请求元信息——以及在匹配式中获取的参数值。
例如,当用户请求了这样的 URL “/articles/2005/05/39323/”,Django 会调用 news.views.article_detail(request, year=2005, month=5, pk=39323)。
news/view.py
: 处理用户发出的请求,从urls.py中对应过来, 通过渲染templates中的模板就可以将网页显示出来
view函数的执行结果只可能有两种:返回一个包含请求页面元素的 HttpResponse 对象,或者是抛出 Http404 这类异常。至于执行过程中的其它的动作则由你决定。
通常来说,一个视图的工作就是:从参数获取数据,装载一个模板,然后将根据获取的数据对模板进行渲染。下面是一个 year_archive 的视图样例:
from django.shortcuts import render
from .models import Article
def year_archive(request, year):
a_list = Article.objects.filter(pub_date__year=year)
context = {'year': year, 'article_list': a_list}
return render(request, 'news/year_archive.html', context)
news/models.py
: 与数据库操作相关,用来通过python代码来描述数据库结构,然后通过命令来创建数据库。大大简化了不熟悉sql语句的开发者的入门门槛。当然用不到数据库的时候 你可以不使用。比如下面这个代码:
from django.db import models
class Reporter(models.Model):
full_name = models.CharField(max_length=70)
def __str__(self):
return self.full_name
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
def __str__(self):
return self.headline
python manage.py makemigrations news
会检测你对模型文件的修改,并生成news/migrations/0001_initial.py
,这个命令只是将你对数据库的变更存储为一个文件,通过python manage.py migrate
命令才会真正的在数据库中创建表。migrate 命令检查 INSTALLED_APPS 设置,为其中的每个应用创建需要的数据表,至于具体会创建什么,这取决于你的 mysite/settings.py 中的设置和每个app的models文件。
django就可以将上述models.py代码中描述的数据库结构创建为一个数据库,而不用像专业的dba那样写一大段sql语句。
在真正的创建之前,你可以通过 python manage.py sqlmigrate news 0001
来查看会执行什么sql语句。
还可以 python manage.py check
检查项目中存在的错误。
默认使用的是sqLite数据库。如果你使用mysql,你需要在setting中作如下设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'mysite',
'USER': 'root',
'PASSWORD': 'password',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
这个 migrate 命令选中所有还没有执行过的迁移(Django 通过在数据库中创建一个特殊的表 django_migrations 来跟踪执行过哪些迁移)并应用在数据库上 - 也就是将你对模型的更改同步到数据库结构上。
迁移是非常强大的功能,它能让你在开发过程中持续的改变数据库结构而不需要重新删除和创建表 - 它专注于使数据库平滑升级而不会丢失数据。我们会在后面的教程中更加深入的学习这部分内容,现在,你只需要记住,改变模型需要这三步:
编辑 models.py 文件,改变模型。
运行 python manage.py makemigrations 为模型的改变生成迁移文件。
运行 python manage.py migrate 来应用数据库迁移。
数据库迁移被分解成生成和应用两个命令是为了让你能够在代码控制系统上提交迁移数据并使其能在多个应用里使用;这不仅仅会让开发更加简单,也给别的开发者和生产环境中的使用带来方便。
news/templates/文件夹
: views.py 中的函数渲染templates中的Html模板,得到动态内容的网页。
上面的代码加载了 news/year_archive.html 模板。
Django 允许设置搜索模板路径,这样可以最小化模板之间的冗余。在 Django 设置中,你可以通过 DIRS 参数指定一个路径列表用于检索模板。如果第一个路径中不包含任何模板,就继续检查第二个,以此类推。
让我们假设 news/year_archive.html 模板已经找到。它看起来可能是下面这个样子:
# mysite/news/templates/news/year_archive.html
{% extends "base.html" %}
{% block title %}Articles for {{ year }}{% endblock %}
{% block content %}
Articles for {{ year }}
{% for article in article_list %}
{{ article.headline }}
By {{ article.reporter.full_name }}
Published {{ article.pub_date|date:"F j, Y" }}
{% endfor %}
{% endblock %}
news/admin.py
:管理后台,当你的模型完成定义,你只需简单的在 admin 站点上注册你的模型即可:
from django.contrib import admin
from . import models
admin.site.register(models.Article)
创建 Django 应用的典型流程是: 先建立数据模型,然后搭建管理站点,之后你的员工(或者客户)就可以向网站里填充数据了。后面我们会谈到如何展示这些数据。
基本命令
1.新建项目
django-admin.py startproject HelloWorld
2.新建app
python manage.py startapp app_name
或 django-admin.py startapp app_name
3.创建数据库表 或 更改数据库表或字段
Django 1.7.1及以上 用以下命令
a. 创建更改的文件
python manage.py makemigrations
b. 将生成的py文件应用到数据库
python manage.py migrate
这种方法可以在SQL等数据库中创建与models.py代码对应的表,不需要自己手动执行SQL。
4.使用开发服务器
开发服务器,即开发时使用,一般修改代码后会自动重启,方便调试和开发,但是由于性能问题,建议只用来测试,不要用在生产环境。
python manage.py runserver
监听机器所有可用 ip (电脑可能有多个内网ip或多个外网ip)
python manage.py runserver 0.0.0.0:8000
5.清空数据库
python manage.py flush
此命令会询问是 yes 还是 no, 选择 yes 会把数据全部清空掉,只留下空表。
6.创建超级管理员
python manage.py createsuperuser
按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
修改 用户密码:
python manage.py changepassword username
7.导出数据 导入数据
python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json
8.Django 项目环境终端
python manage.py shell
如果你安装了 bpython 或 ipython 会自动用它们的界面,推荐安装 bpython。
这个命令和 直接运行 python 或 bpython 进入 shell 的区别是:你可以在这个 shell 里面调用当前项目的 models.py 中的 API,对于操作数据,还有一些小测试非常方便。
9.数据库命令行
python manage.py dbshell
Django 会自动进入在settings.py中设置的数据库,如果是 MySQL 或 postgreSQL,会要求输入数据库用户密码。
在这个终端可以执行数据库的SQL语句。如果您对SQL比较熟悉,可能喜欢这种方式。
10.更多命令
终端上输入 python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用。