Django框架的核心包括:一个 面向对象 的映射器,用作数据模型(以类的形式定义)和关系性数据库间的媒介;一个基于正则表达式的URL分发器;一个视图系统,用于处理请求;以及一个模板系统。

创建一个项目

如果你是第一次使用 Django,你首先需要自动生成一些核心代码,创建一个Django项目

1
django-admin startproject mysite

现在我们就创建了一个mysite目录,目录中的内容包含下列文件:

1
2
3
4
5
6
7
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
  • mysite 是最外层的 root 目录使我们项目的容器,我们可以随便的修改名称
  • manage.py 一个实用的命令行工具,运行你与Django进行交互
  • mysite 文件夹相当于 Python 的包
  • mysite/settings.py Django 的设置/配置文件
  • mysite/urls.py 声明 Django 中的 URL,阅读更多

开发服务

运行当前的服务

1
python manage.py runserver

改变服务端口

1
python manage.py runserver 8080

创建 App

1
python manage.py startapp (AppName)

创建完之后开始编写视图

打开polls/views.py文件 然后添加下列代码

1
2
3
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")

这是一个简单的 view , 显示这个 view 我们 需要映射 URL,我们需要一个URLconf.
在 pools 创建一个urls.py

1
2
3
4
5
from .import views
urlpatterns = [
url('^index/$',views.index)
]

下一步我们需要将 App 中的 url 映射包含到项目中,打开mysite/urls.py,然后导入pools 中的 url 映射

1
2
3
4
5
6
7
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^polls/', include('polls.urls')),
url(r'^admin/', admin.site.urls),
]

数据库操作

Django 默认使用 Sqlite 数据库,Sqlite包含在 Python 中,所以你不需要自己去安装Sqlite.
如果你需要改变其他数据库,首先需要去安装数据库 database 然后改变根目录中settings. py 文件中的 `DATABASES’ 中的内容

创建数据库模型

在我们的App 的 models.py 文件中创建我们自己的数据库映射模型

1
2
3
4
5
6
7
8
from django.db import models
# Create your models here.
class Article (models.Model):
title = models.CharField(max_length=32,default='Title')
content = models.TextField(null=True)

然后执行命令进行迁移操作

1
python manage.py makemigrations [AppName]

如果想查看创建模型中的 SQL 语句执行下面操作

1
python manage.py sqlmigrate (AppName) 0001

最后再执行migrate应用所有的迁移,在数据库中创建这个模型

1
python manage.py migrate

使用数据库

在views.py 中查询数据库,传递给 html 文件

1
2
3
def index(request):
article = models.Article.objects.get(pk=1)
return render(request, 'blog/index.html', {'article': article})

在 Html 文件中显示数据库的内容

1
2
<h1>{{article.title}}</h1>
<h3>{{article.content}}<h3>

Admin

Djago自带Admin, 所以不需要我们自己去编写

创建 admin user

1
python manage.py createsuperuser

打开http://127.0.0.1:8000/admin/ 便可以看到后台管理界面

设置可以 andmin 可修改的操作

编辑 app 下的 admin.py 文件

1
2
from . import models
admin.site.register(models.Article)

这样一来在 admin 后台就可以修改 Article 中的数据了

修改数据默认显示名称

在 Article 类中添加一个方法

1
2
def __str__(self):
return self.title

博客搭建

主页面

在 views.py 中,查询数据库所有数据,然后传递给 html

1
articles = models.Article.objects.all()

在Html 文件中遍历集合数据,并显示

1
2
3
4
{% for article in articles %}
<a href="">{{ article.title }}</a>
</br>
{% endfor %}

内容页面

在 views.py 中,添加一个方法,方法的参数是article_id,我们用这个参数来标识是那片文章,

1
2
3
def article_page(request,article_id):
article = models.Article.objects.get(pk=article_id)
return render(request,'blog/article_page.html',{'article':article})

在 urls.py 中进行注册 url,article_id就是我们传递的参数,必须和参数名一致,根据这个参数来显示不同内容

1
url('^article/(?P<article_id>[0-9]+)$',views.article_page)

命名空间

根 urls, 写在 include()的第二个参数位置, namespace = 'blog'

1
url(r'^blog/', include('blog.urls',namespace='blog'))

应用下 urls,写在url的第三个参数位置, name = 'article'

1
url('^article/(?P<article_id>[0-9]+)$',views.article_page,name='article')

设置完命名空间后,在主页的 html 中跳转到详情页

1
<a href="{% url 'blog:article_page' article.id %}">{{ article.title }}</a>

编辑页面

首先在 views.py 中添加下面代码,根据 article_id 是否等于0判断是新建还是编辑页面

1
2
3
4
5
6
def edit_page(request, article_id):
if str(article_id) == '0':
return render(request, 'blog/edit_page.html')
else:
article = models.Article.objects.get(pk=article_id)
return render(request, 'blog/edit_page.html', {'article': article})

在 urls 中添加编辑页面的映射

1
url('^edit/(?P<article_id>[0-9]+)$',views.edit_page,name='edit_page'),

在编辑HTML页面创建一个 form 表单
edit_page.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<form action="{% url 'blog:edit_action' %}" method="post">
<br/>{% csrf_token %}<br/>
<input type="hidden" name="article_id" value="{{ article.id | default:'0' }}">
<label>文章标题
<input type="text" name="title" value="{{ article.title }}">
</label>
<br>
<label>文章内容
<input type="text" name="content" value="{{ article.content }}">
</label>
<br>
<input type="submit" value="提交">
</form>

在编辑响应页面取出 from 表单中的内容,根据 article_id 是否为0来做不同操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def edit_action(request):
title = request.POST.get('title', 'TITLE')
content = request.POST.get('content', 'CONTENT')
article_id = request.POST.get('article_id', '0')
if str(article_id) == '0':
models.Article.objects.create(title=title, content=content)
articles = models.Article.objects.all()
return render(request, 'blog/index.html', {'articles': articles})
article = models.Article.objects.get(pk=article_id)
article.title = title
article.content = content
article.save()
return render(request, 'blog/article_page.html', {'article': article})

在 urls 中添加映射

1
url('^edit/action$', views.edit_action,name='edit_action')

Django Shell

一个 Python的交互命令行程序,可以让我们与项目进行交互
作用:1. 调试 2测试未知方法(得到一个未知的方法,在代码使用之前可以在 shell 中进行测试)

1
2
3
4
5
6
7
python manage.py shell
from blog.models import Article
Article.objects.all()
结果:
<QuerySet [<Article: 小书包>, <Article: Title>, <Article: caimuhao1>]>
>>>

Admin增强

1
2
3
4
5
6
7
8
9
from django.contrib import admin
from . import models
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title','content','pub_time')
list_filter = ('pub_time',)
admin.site.register(models.Article,ArticleAdmin)