提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Django工程搭建笔记
前言
IDE:PyCharm社区版
Python3.6.8
笔记参考Django官方网站学习记录
Demo应用polls为官方投票应用
提示:以下是本篇文章正文内容,下面案例可供参考
一、Django安装及调试
-
安装,pip install django
-
验证django版本,python -m django --version
-
创建项目,django-admin startproject mysite
-
启动服务器,python manage.py runserver,在Terminal创空按住Ctrl+C可终止server
-
浏览器查看页面
二、Demo工程
2.1 创建应用
-
新建应用polls,python manage.py startapp polls
-
在polls/views.py视图中输入下列响应内容
-
在应用polls下新建视图urls.py(url config文件),并编辑以下内容,实现在polls应用中调用views.index响应
-
在根url config文件中加入polls应用的url config。在mysite/urls.py文件添加以下内容,实现对polls应用的url的调用。从第二张图可以看到在mysite/setting中配置了mysite、urls.py为根url config。
-
在server没有关闭的情况下,分别用chrome浏览器打开http://127.0.0.1:8000/admin/和http://127.0.0.1:8000/polls/可以看到以下结果
2.2 编写应用
2.2.1 Polls投票应用
2.2.1.1 数据库配置
- 配置mysite/setting.py中的相应参数
- python manage.py migrate:创建数据表,支持默认installed_apps,检查默认设置为每个应用创建需要的数据表
2.2.1.2 创建模型
简单的投票应用需要创建两个模型Question,Choice。在polls/model.py加入以上两个模型。一个模型本质上是一张表。
以Choice类进行说明:
- 继承自 django.db.models.Model 类
- 属性choice_text:数据库字段名,即数据库有一列名为‘choice_text’,亦可单独命名。为CharField的实例,表示每个字段要处理的数据类型。CharField继承django.db.models.Field。
- 实例化入参max_length:用于数据库数据校验。
- ForeignKey():定义表关系,每个 Choice 对象都关联到一个 Question 对象,常用的数据库关系:多对一、多对多和一对一。
2.2.1.3 激活模型
-
在根设置中安装polls app:即将polls添加到INSTALLED_APPS中。因为 PollsConfig 类写在文件 polls/apps.py 中,所以它的点式路径是 ‘polls.apps.PollsConfig’
-
检测对模型文件的修改:python manage.py makemigrations polls。修改部分存储为一次迁移migration。
-
查看polls应用的0001迁移内容:python manage.py sqlmigrate polls 0001
-
执行迁移:python manage.py migrate
-
。
2.2.2 settings.py
2.2.2.1 INSTALLED_APPS
包括了在项目中启用的所有 Django 应用
- django.contrib.admin – 管理员站点
- django.contrib.auth – 认证授权系统
- django.contrib.contenttypes – 内容类型框架
- django.contrib.sessions – 会话框架
- django.contrib.messages – 消息框架
- django.contrib.staticfiles – 管理静态文件的框架
2.2.2.2 MIDDLEWARE
2.2.2.3 TEMPLATES
描述了 Django 如何载入和渲染模板
- BACKEND:默认的设置文件设置了 DjangoTemplates 后端
- DIRS:
- APP_DIRS:默认为True,会让 DjangoTemplates 在每个 INSTALLED_APPS 文件夹中寻找 “templates” 子目录。django找到的默认 app_directories为polls/templates/,因此只需要使用 polls/index.html 就可以引用index模板。实际上index模板的完整路径为polls/templates/polls/index.html。
- OPTIONS
2.2.2.4 DATABASES
ENGINE – 可选值有
- ‘django.db.backends.sqlite3’
- ‘django.db.backends.postgresql’
- ‘django.db.backends.mysql’
- ‘django.db.backends.oracle’
NAME
- 数据库的名称。如果使用的是 SQLite,数据库将是你电脑上的一个文件,在这种情况下, NAME 应该是此文件的绝对路径,包括文件名。默认值 os.path.join(BASE_DIR, ‘db.sqlite3’) 将会把数据库文件储存在项目的根目录
2.2.2.5 OTHERS
2.3 创建管理账号
启动服务器,python manage.py runserver
进入127.0.0.1:8000/admin,输入上方账户密码即可进入下方页面
其中可编辑的内容:组和用户。它们是由 django.contrib.auth 提供的,这是 Django 开发的认证框架
2.4 向管理页面加入应用
刷新127.0.0.1:8000/admin可看到下方界面
2.5 调用API
添加在polls应用Question表中增加一条记录"What’s new?"
重启服务器,刷新原登录后页面查看新增内容
2.6 添加更多的视图
添加视图
将视图添加到polls应用urls.py中在浏览器中输入http://127.0.0.1:8000/polls/1/results/,查看新增视图
每个视图必须要做的只有两件事:返回一个包含被请求页面内容的 HttpResponse 对象,或者抛出一个异常,比如 Http404
2.7 动态读取数据库中记录
2.8 视图和页面设计解耦
polls 目录里创建一个 templates 目录,templates下新建polls目录,polls/templates/polls下新建index.html。
划重点:在templates下边要建与应用同名的文件夹,在其下再添加网页模板,避免polls的模板与其他应用模板重名,Django找错的情况。
官方解释如下:
加入代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
</body>
</html>
polls/views中index做如下修改
from django.http import HttpResponse
from django.template import loader
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = {'latest_question_list': latest_question_list,}
return HttpResponse(template.render(context, request))
或者利用render函数精简:
from django.shortcuts import render
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list,}
return render(request, 'polls/index.html', context)
http://127.0.0.1:8000/polls/查看
点击链接
2.9 抛出404错误
在templates/polls中新建detail.html内容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ question }}
</body>
</html>
polls/views,py中修改detail函数如下:
from django.http import HttpResponse, Http404
def detail(request, question_id):
try:
question = Question.objects.get(pk=question_id)
except Question.DoesNotExist:
raise Http404("Question does not exist")
return render(request, 'polls/detail.html', {'question': question})
或使用get_object_or_404()
from django.shortcuts import render, get_object_or_404
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
2.10 添加命名空间,消除index硬编码
在polls/urls.py中urlpatterns上方添加代码
app_name = 'polls'
polls/templates/polls/index.html修改代码
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
解释详见https://docs.djangoproject.com/zh-hans/2.0/intro/tutorial03/