快速安装
假设你已经安装好了python,那么进入命令行工具,开始安装django,这里直接是全局安装,如果需要使用虚拟环境,安装方式会不同。
$ pip install diango
创建项目
进入你需要安装django的文件夹,使用命令行,先创建django的项目,再创建app。项目代表的是整个网站,而app其实就是这个网站里面的功能包,一个网站就是一个项目,一个项目里面可以有很多app。
$ django-admin startproject mysite$ python manage.py startapp news
设计模型
django提供了便捷的orm工具,通过这个,可以更为简单的来设计你的数据库,并且不需要任何一句sql代码。
修改刚才创建的app news文件夹内的models.py,来添加2个模型进去。整体文件夹目录应该如下:
mysite/news/models.py
from django.db import modelsclass Reporter(models.Model): full_name = models.CharField(max_length=70) def __str__(self): return self.full_nameclass Atricle(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
模型应用到数据库
模型虽然已经创建成功了,但是并没有应用到数据库,在命令行里面,使用下面2行命令,来让模型应用到数据库。
$ python manage.py makemigrations$ python manage.py migrate
makemigrations命令可以查找到所有的可用models,并且如果这个models如果不在数据库,会创建对应的migrations脚本文件。
而migrateming命令,则是让这些migrations来自动创建数据库表和结构的命令。
开始使用 django 的 orm
接来下,在命令行里面,进入python。就可以使用命令行来快速体验django的orm的便捷性。
$ python# 导入django mysite项目中的app news的model>>> from news.models import Article, Reporter# 查找Reporter表内所有的数据,现在还没有数据,所以是空的>>> Reporter.objects.all() # 创建一个新的Reporter项目>>> r = Reporter( full_name = 'John Smith')# 把这个新的Reporter项目插入到数据库>>> r.save()# 插入到数据库之后,这个变量为r的Reporter项目就会自动返回数据库的id了>>> r.id1# 我们再次查找Reporter表内的所有数据,这次就能找到一个数据了>>> Reporter.objects.all()]> # 输出这个数据的full_name字段的值>>> r.full_name'John Smith'# django orm中其他获取数据的方式# 查找ID为1的数据>>> Reporter.objects.get(id=1) #查找以John开头的数据>>> Reporter.objects.get(full_name__startswith = 'John') # 查找以mith结尾的数据>>> Reporter.objects.get(full_name__contains='mith') # 查找id=2的数据,因为我们的表中并不存在id为2的数据,所以会抛出一个错误>>> Reporter.objects.get( id = 2)Traceback (most recent call last): ... DoesNotExist: Reporter matching query does not exist. # 创建一个 article项目。>>> from datetime import date>>> a = Atricle( pub_date = date.today(), headline = 'Django is cool',content = 'Yeah.' , reporter = r)>>> a.save()# 现在从article中获取数据>>> Article.objects.all()# 通过article中设置的reporter外键,来查找reporter中的数据>>> r = a.reporter>>> r.full_name'John Smith'# 反向通过Reporter中的数据来查找Article中的数据>>> r.article_set.all()# 在Article表中,可以直接使用Reporter表的数据来反向查找Article表中的数据,因为设置了外键,这里查找Reporter中以John开头的数据的Atricle中的数据 >>> Article.objects.filter(reporter__full_name__startswith='John')# 修改Reporter中的数据>>> r.full_name = 'Billy Goat'>>> r.save()# 删除Reporter的数据>>> r.delete()
模型注册到django自带的admin后台
django自带了一个非常强大的admin后台,我们创建了模型之后,只需要把这个模型注册到后台里面,这样可以直接在后台中可视化添加数据。
在 mysite/news/admin.py 中添加代码:
from django.contrib import adminfrom . import modelsadmin.site.register(models.Article)
这样就可以把模型注册到后台了,在后台就可以直接添加Atricle数据了。
建立URLs路由
上面我们已经创建了项目也创建了app和数据模型,并且已经成功了插入了一条数据到数据库,现在,就开始创建路由和视图,这样我们插入的数据,就可以通过url访问到了。
在 mysite/news/urls.py 中添加代码,一般在django app文件夹中是没有urls.py这个文件的,我们可以手动创建一个。
from django.urls import pathfrom . import viewsurlpatterns = [ path('articles//', views.year_archive), path('articles///', views.month_archive), path('articles', views.article_detail),]
上面建立了3个路由规则,并且每个路由都指向了一个视图的函数,现在建立了路由,下一步就开始建立视图函数,这样通过路由访问url,然后django会引用视图函数,来输出内容。
编写视图
视图函数可以返回被请求的数据,视图函数的工作就是从数据库中获取数据,然后传递给模板,进行数据渲染,这样一个网页就展示在用户的面前了。
在 mysite/news/views.py 中添加视图函数。
from django.shortcuts import renderfrom .models import Articledef 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/year_archive.html 模板,并且向这个模板中传递了context数据,现在开始编写这个模板,把context这个数据在模板中显示出来。
这个模板的具体文件夹位置,应该是在 mysite/news/templates/news/year_archive.html ,在app news文件夹中新建一个templates模板文件夹,并且在这个模板文件夹里面还需要建立一个news文件夹,这个是为了防止django在查找模板的时候会和其他app的模板重命而让django出现错误。
{% 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 %}
这个模板中的变量用大括号都括起来了,这个的意思就是输出变量的值。并且模板的开头使用了 extends 'base.html',说明这个模板继承的是base.html模板,这样就可以让公共代码写入到base.html中,减少模板之间代码的冗余。
下面我们开始写一个base.html模板,一般基础模板,我们可以直接写在项目的templates文件夹下面,而不是app的templates文件夹下面。
mysite/templates/base.html
{% load static %} {% block title %}{% endblock %} {% block content %}{% endblock %}
我们可以看到base.html开头使用了load static,这个就是可以直接引用django下的静态文件,比如图片,js,还有css等。这些静态文件的储存路径一般在项目的static文件夹下面。
这样我们一个最简单的django项目就建立成功了。