笔记-django第一个项目

1.      创建项目

安装 Django 之后,现在有了可用的管理工具 django-admin。可以使用 django-admin 来创建一个项目:

看下django-admin 的命令介绍:

1.1.    startproject

django-admin startproject HelloWorld

创建完成后我们可以查看下项目的目录结构:

$ cd HelloWorld/

$ tree

.

|-- HelloWorld

|   |-- __init__.py

|   |-- settings.py

|   |-- urls.py

|   `-- wsgi.py

`-- manage.py

目录说明:

HelloWorld: 项目的容器。

manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。

HelloWorld/__init__.py: 一个空文件,告诉 Python 该目录是一个 Python 包。

HelloWorld/settings.py: 该 Django 项目的设置/配置。

HelloWorld/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。

HelloWorld/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。

接下来我们进入 HelloWorld 目录输入以下命令,启动服务器:

python3 manage.py runserver 0.0.0.0:8000

0.0.0.0 让其它电脑可连接到开发服务器,8000 为端口号。如果不说明,那么端口号默认为 8000。

呃,修改一下启动方式,使用脚本启动

# start_dj.py

import os

import sys

def start_django():

os.system('python manage.py runserver 127.0.0.1:8000')

if __name__ == "__main__":

start_django()

这时已经可以运行了,在浏览器中可以访问,但会被指向默认页面。

2.      新增响应页面

与flask类似,需要添加url规则及视图(响应函数)。

视图配置

在先前创建的 HelloWorld 目录下的 HelloWorld 目录新建一个 view.py 文件,并输入代码:

HelloWorld/HelloWorld/view.py 文件代码:

from django.http import HttpResponse def hello(request): return HttpResponse("Hello world ! ")

接着,绑定 URL 与视图函数。打开 urls.py 文件,删除原来代码,将以下代码复制粘贴到 urls.py 文件中:

HelloWorld/HelloWorld/urls.py 文件代码:

from django.conf.urls import url from . import view urlpatterns = [ url(r'^$', view.hello), ]

3.      模板

第一步:在应用目录下创建 templates 目录并建立 hello.html文件:

第二步:修改模板文件的路径,到HelloWorld/settings.py中修改TEMPLATES变量的 DIRS 为 [BASE_DIR+"/templates",]

第三步:需要在view.py中声明响应函数

from django.shortcuts import render

def hello(request):

context = {}

context['hello'] = 'Hello World!'

return render(request, 'hello.html', context)

3.1.    shortcuts模板标签

if/else 标签

基本语法格式如下:

{% if condition %}

... display

{% endif %}

或者:

{% if condition1 %}

... display 1

{% elif condition2 %}

... display 2

{% else %}

... display 3

{% endif %}

根据条件判断是否输出。if/else 支持嵌套。

{% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ),例如:

{% if athlete_list and coach_list %}

athletes 和 coaches 变量都是可用的。

{% endif %}

for 标签

{% for %} 允许我们在一个序列上迭代。

与Python的 for 语句的情形类似,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定的循环中使用的变量名称。

每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。

例如,给定一个运动员列表 athlete_list 变量,我们可以使用下面的代码来显示这个列表:

<ul>

{% for athlete in athlete_list %}

<li>{{ athlete.name }}</li>

{% endfor %}

</ul>

给标签增加一个 reversed 使得该列表被反向迭代:

{% for athlete in athlete_list reversed %}

...

{% endfor %}

可以嵌套使用 {% for %} 标签:

{% for athlete in athlete_list %}

<h1>{{ athlete.name }}</h1>

<ul>

{% for sport in athlete.sports_played %}

<li>{{ sport }}</li>

{% endfor %}

</ul>

{% endfor %}

ifequal/ifnotequal 标签

{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。

下面的例子比较两个模板变量 user 和 currentuser :

{% ifequal user currentuser %}

<h1>Welcome!</h1>

{% endifequal %}

和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:8

{% ifequal section 'sitenews' %}

<h1>Site News</h1>

{% else %}

<h1>No News Here</h1>

{% endifequal %}

注释标签

Django 注释使用 {# #}。

{# 这是一个注释 #}

过滤器

模板过滤器可以在变量被显示前修改它,过滤器使用管道字符,如下所示:

{{ name|lower }}

{{ name }} 变量被过滤器 lower 处理后,文档大写转换文本为小写。

过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:

{{ my_list|first|upper }}

以上实例将第一个元素并将其转化为大写。

有些过滤器有参数。 过滤器的参数跟随冒号之后并且总是以双引号包含。 例如:

{{ bio|truncatewords:"30" }}

这个将显示变量 bio 的前30个词。

其他过滤器:

addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。

date : 按指定的格式字符串参数格式化 date 或者 datetime 对象,实例:

{{ pub_date|date:"F j, Y" }}

length : 返回变量的长度。

include 标签

{% include %} 标签允许在模板中包含其它的模板的内容。

下面这个例子都包含了 nav.html 模板:

{% include "nav.html" %}


模板继承

模板可以用继承的方式来实现复用。

接下来我们先创建之前项目的 templates 目录中添加 base.html 文件,代码如下:

HelloWorld/templates/base.html 文件代码:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <h1>Hello World!</h1> <p>菜鸟教程 Django 测试。</p> {% block mainbody %} <p>original</p> {% endblock %} </body> </html>

以上代码中,名为 mainbody 的 block 标签是可以被继承者们替换掉的部分。

所有的 {% block %} 标签告诉模板引擎,子模板可以重载这些部分。

hello.html 中继承 base.html,并替换特定 block,hello.html 修改后的代码如下:

HelloWorld/templates/hello.html 文件代码:

{%extends "base.html" %} {% block mainbody %} <p>继承了 base.html 文件</p> {% endblock %}

第一行代码说明 hello.html 继承了 base.html 文件。可以看到,这里相同名字的 block 标签用以替换 base.html 的相应 block。

重新访问地址 http://127.0.0.1:8000/hello,输出结果如下:

3.2.    模板引擎

django的默认模板引擎是 django.shortcuts

语法什么的都跟jinjia2类似,

3.2.1.    更换模板引擎

第一步:

声明变量,新建/jinja2_tl/jinja2_env.py

from django.contrib.staticfiles.storage import staticfiles_storage

from django.urls import reverse

from jinja2 import Environment

def environment(**options):

env = Environment(**options)

env.globals.update({

'static': staticfiles_storage.url,

'url': reverse,

})

return env

第二步:

在settings.py中修改变量,新增一个模板声明元素。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS':
[BASE_DIR + '/templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },

#新增引擎声明元素

# 主要改backends,dirs,app_dirs,environment
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS':
[BASE_DIR + '/jinja2_tl/templates'],
        'APP_DIRS': False,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            'environment':'jinja2_tl.jinja2_env.environment',
        },
    },
]

第三步:

新建jinja2_tl/templates目录,用于保存模板文件

新建jj2_test.html

<h1>这里是jinjia2引擎测试页面</h1>

<p>{{ test }}</p>
<p>模板变量测试</p>

第四步:

修改url及view文件

url(r'jinja2/', view.jinjia_test)

def jinjia_test(request):
    context = {}
    context['test'] = 'jinja2
test'
   
return render(request,
'jj2_test.html', context)

3.2.2.    问题

更换模板引擎后报错?: (admin.E403) A
'django.template.backends.django.DjangoTemplates' instance must be configured
in TEMPLATES in order to use the admin application.

解决办法:
报错原因是必需要有djangoTemplates引擎,不修改原有引擎配置,新增引擎jinja2即可

4. 模型

Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

下面将配置使用mysql

HelloWorld/HelloWorld/settings.py: 文件代码:

DATABASES = { 'default': { 'ENGINE':
'django.db.backends.mysql', # 或者使用 mysql.connector.django 'NAME': 'test', 'USER': 'test', 'PASSWORD':
'test123', 'HOST':'localhost', 'PORT':'3306', } }

定义模型

创建 APP

Django规定,如果要使用模型,必须要创建一个app。我们使用以下命令创建一个
TestModel 的 app:

django-admin startapp testmodel

修改 testmodel/models.py 文件,代码如下:

# models.py from django.db import models

class Test(models.Model):

name = models.CharField(max_length=20)

跟其它ORM大同小异。

接下来在settings.py中找到INSTALLED_APPS这一项,如下:

INSTALLED_APPS = (

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'testmodel',               # 添加此项

)

在命令行中运行:

$ python manage.py migrate   # 创建表结构

$ python manage.py makemigrations
TestModel  # 让 Django 知道我们在我们的模型有一些变更

$ python manage.py migrate TestModel   # 创建表结构

结果如下:

Operations to perform:

Apply all migrations: testmodel

Running migrations:

Applying testmodel.0001_initial... OK

数据操作

数据操作也是在视图函数中做的。

需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:

HelloWorld/HelloWorld/testdb.py: 文件代码:

# -*- coding: utf-8 -*- from django.http import
HttpResponse from TestModel.models import Test # 数据库操作 def
testdb(request): test1 = Test(name='runoob') test1.save() return
HttpResponse("<p>数据添加成功!</p>")

4.1.  其它常用数据操作

获取数据

Django提供了多种方式来获取数据库的内容,如下代码所示:

HelloWorld/HelloWorld/testdb.py: 文件代码:

# -*- coding: utf-8 -*- from django.http
import HttpResponse from TestModel.models import Test # 数据库操作 def
testdb(request): # 初始化 response = "" response1 = "" # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT *
FROM list = Test.objects.all() # filter相当于SQL中的WHERE,可设置条件过滤结果
response2 = Test.objects.filter(id=1) # 获取单个对象 response3 =
Test.objects.get(id=1) # 限制返回的数据
相当于 SQL 中的 OFFSET 0 LIMIT 2; Test.objects.order_by('name')[0:2] #数据排序
Test.objects.order_by("id") # 上面的方法可以连锁使用
Test.objects.filter(name="runoob").order_by("id") # 输出所有数据 for
var in list: response1 += var.name + " " response = response1 return
HttpResponse("<p>" + response + "</p>")

更新数据

修改数据可以使用 save() 或 update():

HelloWorld/HelloWorld/testdb.py: 文件代码:

# -*- coding: utf-8 -*- from django.http
import HttpResponse from TestModel.models import Test # 数据库操作 def
testdb(request): # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE test1 = Test.objects.get(id=1) test1.name = 'Google'
test1.save() # 另外一种方式 #Test.objects.filter(id=1).update(name='Google') # 修改所有的列 #
Test.objects.all().update(name='Google') return HttpResponse("<p>修改成功</p>")

删除数据

删除数据库中的对象只需调用该对象的delete()方法即可:

HelloWorld/HelloWorld/testdb.py: 文件代码:

# -*- coding: utf-8 -*- from django.http
import HttpResponse from TestModel.models import Test # 数据库操作 def
testdb(request): # 删除id=1的数据 test1 = Test.objects.get(id=1) test1.delete() # 另外一种方式 #
Test.objects.filter(id=1).delete() # 删除所有数据 #
Test.objects.all().delete() return HttpResponse("<p>删除成功</p>")

5. 表单

5.1.   
get方法

# -*- coding: utf-8 -*- from django.http import HttpResponse from django.shortcuts import render_to_response

# 表单

def search_form(request): return render_to_response('search_form.html')

# 接收请求数据

def search(request): request.encoding='utf-8' if 'q' in request.GET: message = '你搜索的内容为: ' +
request.GET['q'] else: message =
'你提交了空表单' return HttpResponse(message)

/HelloWorld/templates/search_form.html
文件代码:

<!DOCTYPE html>

<html>

<head>

<meta
charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

<form action="/search"
method="get">

<input type="text"
name="q">

<input type="submit"
value="搜索">

</form>

</body>

</html>

/HelloWorld/HelloWorld/urls.py
文件代码:

from django.conf.urls
import url

from . import
view,testdb,search

urlpatterns = [

url(r'^hello$', view.hello),

url(r'^testdb$', testdb.testdb),

url(r'^search-form$', search.search_form),

url(r'^search$', search.search),

]

5.2.  post方法

提交数据时更常用POST方法。我们下面使用该方法,并用一个URL和处理函数,同时显示视图和处理请求。

在 templates 创建 post.html:

/HelloWorld/templates/post.html 文件代码:

<body>

<form action="/search-post" method="post">

{% csrf_token %}

<input type="text" name="q">

<input type="submit" value="Submit">

</form>

<p>{{ rlt }}</p>

</body>

在模板的末尾,我们增加一个 rlt 记号,为表格处理结果预留位置。

表格后面还有一个{% csrf_token %}的标签。csrf 全称是 Cross Site Request Forgery。这是Django提供的防止伪装提交请求的功能。POST 方法提交的表格,必须有此标签。

在HelloWorld目录下新建 search2.py 文件并使用 search_post 函数来处理 POST 请求:

/HelloWorld/HelloWorld/search2.py 文件代码:

# -*- coding: utf-8 -*- from
django.shortcuts import render from django.views.decorators import csrf # 接收POST请求数据 def
search_post(request): ctx ={} if request.POST: ctx['rlt'] = request.POST['q']
return render(request, "post.html", ctx)

5.2.1.    问题1

Reason
given for failure:    CSRF token missing or
incorrect.

这个报错的原因是从django1.x开始,加入了CSRF保护,而这里没有设置

需要做两点:

settings.py文件是否存在django.middleware.csrf.CsrfViewMiddleware:

在模板中加入{% csrf_token %}来声明一个token

{% block content %}
<form
action="/search_post"
method="post">
    {% csrf_token %}
    <input type="text"
name="q">
    <input type="submit"
value="submit">

</form>
    <p>{{ rlt }}</p>

{% endblock %}

另外一个问题是案例中使用了jinja2引擎,对token的处理机制有些小区别

将{% csrf_token %}改成

<input
type="hidden"
name="csrfmiddlewaretoken"
value="{{ csrf_token
}}">

后正常

6.     
django-admin

Django 提供了基于 web 的管理工具。

Django 自动管理工具是
django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它:

/HelloWorld/HelloWorld/settings.py 文件代码:

INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth',
'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages',
'django.contrib.staticfiles', )

激活管理工具

通常我们在生成项目时会在 urls.py 中自动设置好,我们只需去掉注释即可。

配置项如下所示:

/HelloWorld/HelloWorld/urls.py 文件代码:

# urls.py from django.conf.urls import url from
django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), ]

使用管理工具

启动开发服务器,然后在浏览器中访问 http://127.0.0.1:8000/admin/,进入管理登录界面:

笔记-django第一个项目的更多相关文章

  1. django 第一个项目测试

    我们安装好Django以后就可以使用Django命令来创建项目了 1.Django 创建第一个项目 安装 Django 之后,您现在应该已经有了可用的管理工具 django-admin.py.我们可以 ...

  2. Cocos2dx 学习笔记整理----第一个项目

    接上一节, 进入新建的项目下面的proj.win32下面,找到项目名.sln文件(我的是game001.sln),双击会通过VS2010打开.(当然,你装了VS什么版本就是什么版本) 将你的项目设为启 ...

  3. Beego 学习笔记二:第一个项目

    第一个MVC项目 1>     使用beego命令,创建一个项目 首先切换到创建项目的位置,输入bee new firstweb命令,创建成功之后会出现一个名为firstweb的文件夹 2> ...

  4. django创建第一个项目helloworld

    环境:centos 7,已安装python 3.6环境 1.安装django并创建django第一个项目 1.1.使用pip安装django# pip install Django或指定安装版本# p ...

  5. 吴裕雄--天生自然Django框架开发笔记:Django 创建第一个项目

    Django 管理工具 安装 Django 之后,您现在应该已经有了可用的管理工具 django-admin.可以使用 django-admin 来创建一个项目: 可以来看下django-admin ...

  6. Django 创建第一个项目(转)

    转自(http://www.runoob.com/django/django-first-app.html) 前面写了不少python程序,由于之前都是作为工具用,所以命令行就足够了,最近写的测试用例 ...

  7. python+Django创建第一个项目

    1.首先搭建好环境 1.1 安装pyhton,Linux系统中,python是系统自带的所以就不用安装 1.2 安装Django框架 使用pip安装: pip install django 1.3 检 ...

  8. 【3】Django创建第一个项目

    天地所以能长且久者,以其不自生,故能长生. --老子<道德经> 写在前面:Django在学习的过程中,我们会参考官方文档,从两部分进行讲解,第一部分主要是一个入门项目的搭建开发,第二部分是 ...

  9. Django 项目创建到启动(最全最详细的第一个项目)

    一.前言 (一).概述 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架 ...

随机推荐

  1. canvas游戏和动画中的碰撞检测(2种简单方式)

    碰撞检测关键步骤 碰撞检测需要处理经历下面两个关键的步骤: 计算判断两个物体是否发生碰撞 发生碰撞后,两个物体的状态和动画效果的处理 计算碰撞 只要两个物体相互接触,它们就会发生碰撞. 矩形物体碰撞检 ...

  2. January 14 2017 Week 2nd Saturday

    Don't try so hard, the best things come when you least expect them to. 不要着急,最好的总会在最不经意时出现. The secon ...

  3. Java实现的有道云笔记图片批量下载工具

    有朋友问我每天哪里找时间写这么多文章. 作为一个程序员,当然要善于利用各种工具提高自己做事情的效率了.如果没有现成的工具,就得自己造. 我写文章一般是在云笔记里编辑,完成之后直接复制粘贴到自媒体平台. ...

  4. 获取DataTable某一列的所有值

    /// <summary> /// 获取某一列的所有值 /// </summary> /// <typeparam name="T">列数据类型 ...

  5. python UI自动化实战记录五:测试页面2 pageobject

    该部分记录测试页面2-StrategyPage,所有页面2上的元素定位.操作.获取属性等方法都写在该类中. 1 页面2继承自BasePage: 2 页面2第一部分写的是所有的定位器 3 页面2第二部分 ...

  6. 四、HTTP和HTTPS的区别

    1:简介 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息.HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可 ...

  7. Windows pycharm Terminal使用Anaconda 的Prompt

    从Stack Overflow上找到的方法如下 在Settings->Terminal->Shell path 改成:cmd.exe "/K" "C:\Use ...

  8. PHP-------- JQUERY方式

     JQUERY方式 1.根据ID取元素,Jquery对象  var div = $("#one"); 2.根据class取  var div = $(".test&quo ...

  9. BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec  Memory ...

  10. xtrabackup2.4选项参考

    该xtrabackup2.4选项参考¶ 此页面记录了xtrabackup二进制文件的所有命令行选项 . 选项 --apply-log-only 此选项仅在准备备份时执行重做阶段.这对增量备份非常重要. ...