笔记-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. [转]How to Leak a Context: Handlers & Inner Classes

    Consider the following code: public class SampleActivity extends Activity { private final Handler mL ...

  2. React Router V4.0学习笔记

    最近在学习React Router,但是网站的教程多半还是3.X版本之前的,所以我只能在GitHub上找到React Router的官方文档在读.后来总结了一下,包括学习经验以及V3.X与V4.X的差 ...

  3. phoneGap的Android下编写phonegap 插件

    一. javascript 端的编写  第一个参数 成功的回调函数 第二个参数 失败的回调函数 第三个参数 是插件的类名称,也就是后台java文件的类名 第四个参数 执行的 action 名称     ...

  4. onload方法注意点

    function initPage() { console.log("浏览器审查元素选择日志可查看!"); } window.onload = initPage; 这里要注意,一定 ...

  5. 【[JLOI2011]飞行路线】

    据说这是分层图最短路的板子题 但其实就是一个\(dij\)多带了一维状态 我们看到\(k\)很小所以显然我们可以设计一个这样的状态 \(d[v][k]\)表示从起点到点\(v\)免费走了\(k\)条路 ...

  6. SpringMVC(1)

    1.简要说明: Spring为展现层提供的基于MVC设计理念的优秀web框架,目前主流的框架 Spring3.0以后全面超越Struts2,成为最优秀的MVC框架 Spring MVC通过一套MVC注 ...

  7. heatmap for arcgisjsapi

    在arcgis for js api 环境下使用heatmap插件. 由于最新的heatmap没有提供 for arcgisjsapi  插件,懒得研究新版本代码,所以这里用的还是老版本的heatma ...

  8. Web—03-神器Photoshop

    常用图片格式 1.psd photoshop的专用格式. 优点:完整保存图像的信息,包括未压缩的图像数据.图层.透明等信息,方便图像的编辑. 缺点:应用范围窄,图片容量相对比较大. 2.jpg 网页制 ...

  9. HTML表格属性及简单实例

    这里主要总结记录下表格的一些属性和简单的样式,方便以后不时之需. 1.<table> 用来定义HTML的表格,具有本地属性 border 表示边框,border属性的值必须为1或空字符串( ...

  10. QLViewController在iOS7下的自定义

    原文来自:QLViewController在iOS7下的自定义 原先的项目使用了quicklook framework,用于在iPhone上浏览各类文件,除了txt文本会有乱码的问题,其他文件的显示都 ...