Django快速入门
前言
记录一些零散的Django学习TIP
Django相关命令行命令和文件结构说明
- 生成project
django-admin startproject mysite(这个是名字)
- 生成的文件结构:
mysite/
manage.py(用来管理Django项目的命令行工具)
mysite/(项目文件夹)
__init__.py(空文件,告诉Python这个目录应该被认为是一个python包)
settings.py(项目的配置文件,包含app、数据库 等)
urls.py (网站的目录,比如http://127.0.0.1/XXXX/,这个文件就保存XXX/)
wsgi.py(运行在与wsgi兼容的web服务器的入口)
- 运行项目命令
py manage.py runserver 8000或
py manage.py runserver 0:8000 0是0.0.0.0的简写,表示监听所有访问的IP
- 创建一个应用(APP)
py manage.py startapp polls(app的名字)
- 生成的APP的目录结构
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
urls.py(保存该app下的目录路径,并且为每个路径传递一个views里定义的函数,也可以命名该路径的名字。 创建了该文件夹后记得要去项目文件下的urls.py里面加入,如 'path('polls/', include('polls.urls')' )
views.py(定义视图函数,视图函数返回的就是HTTP页面的内容,称作HTTP相应)
- 启用APP前需要激活APP的命令
python manage.py migrate
- 激活APP中的模型
即在你在polls/model.py中写了代码后,需要敲如下的命令
py manage.py makemigrations polls
管理员界面
创建管理员账号命令
py manage.py createsuperuser
进入目录 IP/admin/
(例如127.0.0.1/admin/
) 即可进行管理
启用开发服务器
python manage.py runserver
管理员登陆网址:
本地域名的 “/admin/” 目录,比如 “http://127.0.0.1:8000/admin/”
向管理员页面添加需要管理的模型对象:
from django.contrib import admin
from .models import Question
admin.site.register(Question)
Django的HTML路径搜索
假如你的网站IP为
http://127.0.0.1:8000/
当你输入
http://127.0.0.1:8000/polls/34/
django会去你创建的项目(假设为mysite)下找到urls.py,然后逐条匹配urlpatterns变量的路径,假设匹配到了 polls/。接着他会切掉URL中之前的字符串,剩下34/,接着它会把剩下的字符串发送到你创建的APP(假设较polls)中的url.py中进行匹配。
重要文件说明
urls.py解释
例子1
假设在mysite/urls.py 中有如下代码
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
path()有四个参数,每个参数的含义如下:
- route:路径,不会匹配GET和POST参数或域名
- view:使用的视图函数,视图函数的参数为包含该路径的HttpRequest
- kwargs
- name:命名路径的名字
例子2
假设在mysite/polls/url.py
中有如下代码
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.index, name='index'),
path('<int:question_id>/', views.detail, name='detail'),
path('<int:question_id>/results/', views.results, name='results'),
path('<int:question_id>/vote/', views.vote, name='vote'),
]
添加命名空间
例如:
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.index, name='index'),
path('<int:question_id>/', views.detail, name='detail'),
path('<int:question_id>/results/', views.results, name='results'),
path('<int:question_id>/vote/', views.vote, name='vote'),
]
命名空间可以用来区分不同的视图(views)
工程文件setting.py说明
- TIME_ZONE:每次编辑前都要设置这个变量为自己的时区
- INSTALLED_APPS:包含你要启动的Django应用
- 默认开启的某些应用(app)需要至少一个数据表
要记得加入你创建的APP
例如:
INSTALLED_APPS = [
'polls.apps.PollsConfig', # polls模型
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
数据库模型的建立
在 Django 里写一个数据库驱动的 Web 应用的第一步是定义模型 - 也就是数据库结构设计和附加的其它元数据。
我们需要编辑polls/models.py文件
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200) # 最大长位200
votes = models.IntegerField(default=0)
Tip:
- 每个模型被表示为 django.db.models.Model 类的子类。每个模型有一些类变量,它们都表示模型里的一个数据库字段。
- 每个字段都是 Field 类的实例
数据库模型的激活
为了在我们的工程中包含这个应用,我们需要在配置类 INSTALLED_APPS
中添加设置。因为 PollsConfig 类写在文件 polls/apps.py
中,所以它的点式路径是 polls.apps.PollsConfig
。在文件 mysite/settings.py
中 INSTALLED_APPS
子项添加点式路径后,它看起来像这样:
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
此后执行以下步骤
改变模型的三步:
- 编辑 models.py 文件,改变模型。
- 运行 python manage.py makemigrations 为模型的改变生成迁移文件。
(通过运行 makemigrations 命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次迁移。即记录我们对models.py的所有改动,并且将这个改动迁移到migrations这个文件下生成一个文件) - 运行 python manage.py migrate 来应用数据库迁移。
(这个命令为INSTALLED_APPS中的每个应用创建需要的数据表。)
Django数据库的配置
修改的位置:mysite/setting.py
默认数据库:SQLite
如果需要修改数据库,需改动变量-DATABASES中’default’的键值
原始:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
- 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’) 将会把数据库文件储存在项目的根目录。如果是其他数据库需要替换‘db.sqlite3’
数据库设置详情
数据库模型的属性(API)
假设我们得到了Question类的实例化对象,赋给变量q,那么q有如下API
- q.id:该对象的id
- q.save():把对象保存到数据库中
- Question.objects.all() :获取所有已经创建的对象
- Question.objects.filter(id=1):获取满足条件的对象
- Qustion.objects.get(id=1):返回满足条件的对象
- q.delete():从数据库中删除该对象
视图(views.py)
视图中的模板(Templates)
模板指南
你项目(mysite/setting.py
下) TEMPLATES 配置项描述了 Django 如何载入和渲染模板。默认的设置文件设置了 DjangoTemplates 后端,并将 APP_DIRS 设置成了 True。这一选项将会让 DjangoTemplates 在每个 INSTALLED_APPS 文件夹中寻找 “templates” 子目录。这就是为什么尽管我们没有像在第二部分中那样修改 DIRS 设置,Django 也能正确找到 polls 的模板位置的原因。
模板命名空间
虽然我们现在可以将模板文件直接放在 polls/templates 文件夹中(而不是再建立一个 polls 子文件夹),但是这样做不太好。Django 将会选择第一个匹配的模板文件,如果你有一个模板文件正好和另一个应用中的某个模板文件重名,Django 没有办法 区分 它们。我们需要帮助 Django 选择正确的模板,最简单的方法就是把他们放入各自的 命名空间 中,也就是把这些模板放入一个和 自身 应用重名的子文件夹里。
模板的使用:
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)
去除模板中的硬编码,例子:
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
他会在polls/url.py 中寻找name='detail’的路径
表单处理
表单的意思是,有一系列选项,让你选择一个选项并且提交
关于竞争条件的处理:
点我
通用视图
pass…之后补
自动化测试
自动化测试是由某个系统帮你自动完成的。当你创建好了一系列测试,每次修改应用代码后,就可以自动检查出修改后的代码是否还像你曾经预期的那样正常工作。你不需要花费大量时间来进行手动测试。
可以在每个应用的tests.py
里面编写测试代码
假如有如下测试代码:
import datetime
from django.test import TestCase
from django.utils import timezone
from .models import Question
class QuestionModelTests(TestCase):
def test_was_published_recently_with_future_question(self):
"""
was_published_recently() returns False for questions whose pub_date
is in the future.
"""
time = timezone.now() + datetime.timedelta(days=30)
future_question = Question(pub_date=time)
self.assertIs(future_question.was_published_recently(), False)
自动化测试的过程:
- python manage.py test polls 将会寻找 polls 应用里的测试代码
- 它找到了 django.test.TestCase 的一个子类
- 它创建一个特殊的数据库供测试使用
- 它在类中寻找测试方法——以 test 开头的方法。
- 在 test_was_published_recently_with_future_question 方法中,它创建了一个 - - pub_date 值为 30 天后的 Question 实例。
- 接着使用 assertls() 方法,发现 was_published_recently() 返回了 True,而我们期望它返回 False。
静态文件
网络应用通常需要一些额外的文件——比如图片,脚本和样式表——来帮助渲染网络页面。在 Django 中,我们把这些文件统称为“静态文件”。
在你的 polls 目录下创建一个名为 static 的目录。Django 将在该目录下查找静态文件
例子:
将以下代码放入样式表(polls/static/polls/style.css)
li a {
color: green;
}
在 polls/templates/polls/index.html 的文件头添加以下内容:
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}">