Django快速入门整理 Bertha 。 2021-09-23 11:34 325阅读 0赞 ### Django快速入门 ### * 前言 * Django相关命令行命令和文件结构说明 * 管理员界面 * Django的HTML路径搜索 * 重要文件说明 * * urls.py解释 * * 例子1 * 例子2 * 添加命名空间 * 工程文件setting.py说明 * 数据库模型的建立 * * 数据库模型的激活 * Django数据库的配置 * 数据库模型的属性(API) * 视图(views.py) * * 视图中的模板(Templates) * 表单处理 * * 通用视图 * 自动化测试 * 静态文件 * 自定义后台 # 前言 # 记录一些零散的Django学习TIP # Django相关命令行命令和文件结构说明 # 1. 生成project > django-admin startproject mysite(这个是名字) 1. 生成的文件结构: 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服务器的入口) 1. 运行项目命令 > py manage.py runserver 8000或 > py manage.py runserver 0:8000 0是0.0.0.0的简写,表示监听所有访问的IP 1. 创建一个应用(APP) > py manage.py startapp polls(app的名字) 1. 生成的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相应) 1. 启用APP前需要激活APP的命令 > python manage.py migrate 1. 激活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说明 ## 1. TIME\_ZONE:每次编辑前都要设置这个变量为自己的时区 2. 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’。其它[可用数据库][Link 1]。 * **NAME** \- 数据库的名称。如果使用的是 SQLite,数据库将是你电脑上的一个文件,在这种情况下, NAME 应该是此文件的绝对路径,包括文件名。默认值 os.path.join(BASE\_DIR, ‘db.sqlite3’) 将会把数据库文件储存在项目的根目录。如果是其他数据库需要替换‘db.sqlite3’ [数据库设置详情][Link 2] ## 数据库模型的属性(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():从数据库中删除该对象 # [视图][Link 3](views.py) # ## 视图中的模板(Templates) ## [模板指南][Link 4] 你项目(`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’的路径 # 表单处理 # 表单的意思是,有一系列选项,让你选择一个选项并且提交 > 关于**竞争条件**的处理: > [点我][Link 5] ## 通用视图 ## 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' %}"> # 自定义后台 # [官网链接][Link 6] [Link 1]: https://docs.djangoproject.com/zh-hans/2.1/ref/databases/#third-party-notes [Link 2]: https://docs.djangoproject.com/zh-hans/2.1/ref/settings/#std:setting-DATABASES [Link 3]: https://docs.djangoproject.com/zh-hans/2.1/intro/tutorial03/ [Link 4]: https://docs.djangoproject.com/zh-hans/2.1/topics/templates/ [Link 5]: https://docs.djangoproject.com/zh-hans/2.1/ref/models/expressions/#avoiding-race-conditions-using-f [Link 6]: https://docs.djangoproject.com/zh-hans/2.1/intro/tutorial07/
还没有评论,来说两句吧...