Django——相关知识(二)

来源:互联网 发布:中国科学院大学知乎 编辑:程序博客网 时间:2024/06/07 17:10

学习链接:http://www.runoob.com/django/django-template.html


0、使用 django-admin.py 来创建 HelloWorld 项目

django-admin startproject HelloWorld


目录说明:

  • HelloWorld: 项目的容器。
  • manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
  • HelloWorld/__init__.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
  • HelloWorld/settings.py: 该 Django 项目的设置/配置。
  • HelloWorld/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
  • HelloWorld/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。


1、HttpResponse



对于HttpRequest 对象来说,是由Django自动创建, 但是,HttpResponse对象就必须我们自己创建。每个View方法必须返回一个HttpResponse对象。


HttpResponse类在django.http.HttpResponse。


构造HttpResponses


一般地, 你可以通过给HttpResponse的构造函数传递字符串表示的页面内容来构造HttpResponse对象

2、url.py中 的代码的意思:

“^”匹配字符串首部的子串;

“$”匹配结束部分的子串;

“\b”用于分隔单词;

from django.conf.urls import *from . import view,testdb'''r'^$'正则表达式,只有开始和结尾间隔符号,中间没有要匹配的字符串,则打开网页输入服务器IP:port号(网页要呈现的视图是view模块的hello方法的功能)后不应该再有别的字符串出现了。'''urlpatterns = [    url(r'^hello$', view.hello),    url(r'^testdb$', testdb.testdb),]

3、Django模型:http://www.runoob.com/django/django-model.html

安装MySQL-------->安装MySQL驱动(mysqlclient)------------>settings.py配置DB-------------->定义模型,创建app--------------->修改新建的APP中的models.py

文件------------->settings.py中改INSTALLED_APPS项------------->命令之创建表结构------------->数据库操作,添加testdb.py中------------>修改urls.py文件---------

->开启Django服务器runserver-------------->网页上输入  服务器IP:端口号/urls(匹配的正则表达式中的字符串)

注:安装完MySQL后,要打开command line client命令终端,输入安装MySQL时的密码,登录上MySQL;




4、Django模板:模板是一个文本,用于分离文档的表现形式和内容。

在一个项目中建立templates目录------------>在templates中建立 HTML(hello.html文件)------->向Django说明模板路径,修改settings.py中

TEMPLATES字段的DIRS-------->修改view.py增加一个新对象用于向模板提交数据--------->开启Django服务器runserver-------------->网页上输入  服务

器IP:端口号/urls(匹配的正则表达式中的字符串)


5、Django模板继承:

在一个项目中建立templates目录------------>在templates中建立 HTML(base.html文件)

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 %} 标签告诉模板引擎,子模板可以重载这些部分。

templates中新建hello.html 中继承 base.html,并替换特定 block,hello.html 代码如下:

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

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

--------->向Django说明模板路径,修改settings.py中TEMPLATES字段的DIRS-------->修改view.py增加一个新对象用于向模板提交数据--------->开启

Django服务器runserver-------------->网页上输入  服务器IP:端口号/urls(匹配的正则表达式中的字符串)


6、Django的数据库操作:testdb.py中的代码

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # 数据库操作def testdb(request):    # 初始化    response = ""    response1 = ""    '''添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:'''    test1 = Test(name='huanhuan')#Test是表(属性名=属性值)    test1.save()    # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM    list = Test.objects.all();        # filter相当于SQL中的WHERE,可设置条件过滤结果,返回的是元组,即记录。    response2 = Test.objects.filter(id=2)      # 获取单个对象    response3 = Test.objects.get(id=1) #return HttpResponse("<p>" + str(response3)+ "</p>");返回的是Test object    # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE    test1 = Test.objects.get(id=1)#但是str(test1)是Test object,是什么意思    test1.name = 'Google'    test1.save()    # 另外一种方式    Test.objects.filter(id=32).update(name='yoyo')    # 删除id=1的数据    test1 = Test.objects.get(id=37)    test1.delete()    # 另外一种方式    #Test.objects.filter(name="dadada").delete()#删除所有name="dadada"的记录    #Test.objects.filter(id=24).delete()#删除所有name="dadada"的记录    #Test.objects.filter(name="huanhuan").delete()#删除所有name="dadada"的记录    #数据排序(没试验)    Test.objects.order_by("name")     # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;(没试验)    Test.objects.order_by('name')[0:2]                # 上面的方法可以连锁使用(没试验)    Test.objects.filter(name="runoob").order_by("id")        # 输出所有数据    for var in list:        response1 += var.name + " "#访问记录的某字段;    response = response1    return HttpResponse("<p>" + response+ "</p>");


7、Django表单


8、数据库中外键的知识:


9、【python】【django】migrate 和makemigrations的差别

参考:http://blog.csdn.net/yang1z1/article/details/52235424

django 1.9之后

python manage.py syncdb改为: 

Python manger.py makemigrations

Python manage.py migrate


在你改动了 model.py的内容之后执行下面的命令:

Python manger.py makemigrations

相当于 在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件

你可以手动打开这个文件,看看里面是什么


在此之后执行命令

python manager.py migrate

将该改动作用到数据库文件,比如产生table之类


当makemigrations之后产生了0001_initial.py 文件,你可以查看下该migrations会对应于什么样子的SQL命令

python manger.py sqlmigrate theapp 0001

大概是这个样子的:

BEGIN;CREATE TABLE "polls_choice" (    "id" serial NOT NULL PRIMARY KEY,    "choice_text" varchar(200) NOT NULL,    "votes" integer NOT NULL);CREATE TABLE "polls_question" (    "id" serial NOT NULL PRIMARY KEY,    "question_text" varchar(200) NOT NULL,    "pub_date" timestamp with time zone NOT NULL);ALTER TABLE "polls_choice" ADD COLUMN "question_id" integer NOT NULL;ALTER TABLE "polls_choice" ALTER COLUMN "question_id" DROP DEFAULT;CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id");ALTER TABLE "polls_choice"  ADD CONSTRAINT "polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id"    FOREIGN KEY ("question_id")    REFERENCES "polls_question" ("id")    DEFERRABLE INITIALLY DEFERRED;COMMIT;

10、Python中的import和from import

参考:http://dacoolbaby.iteye.com/blog/1873951

10.1、Python路径介绍

在python用import或者from...import来导入相应的模块。

模块其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中,我们就可以使用了。

这类似于C语言中的include头文件,Python中我们用import导入我们需要的模块。

 

10.2、搜索路径

Python会在以下路径中搜索它想要寻找的模块:

1. 程序所在的文件夹

2. 标准库的安装路径

3. 操作系统环境变量PYTHONPATH所包含的路径

python代码:

import sys  print('================Python import mode==========================');  print ('The command line arguments are:')  for i in sys.argv:      print (i)  print ('\n The python path',sys.path)    from sys import argv,path  #  导入特定的成员  print('================python from import===================================')  print('path:',path) # 因为已经导入path成员,所以此处引用时不需要加sys.path    如果你要使用所有sys模块使用的名字,你可以这样:    from sys import *  print('path:',path)  

10.3、Python项目结构

所以在Python项目里面的区分,按照如下规定进行:

1.严格区分包和文件夹。包的定义就是包含__init__.py的文件夹。

如果没有__init__.py,那么就是普通的文件夹。

2.导入package。 

在python 安装目录的site-package文件夹中新建xxx.pth,内容是需要导入的package所在的文件夹路径。

3.导入模块。

就是一般的模块导入写法,注意只要包路径,不要文件夹路径。



以上面工程为例,

总共有4个包,分别是:package,package1, package2, folder2.(注意,folder1不是package,因为它没有__init__.py)。

这些包所在的文件夹共有两个,test以及test/folder1。  注意,package2所在的文件夹是test,虽然它是包含在folder2里面,但是folder2是一个包,不是一个文件夹。

因此在site-package中新建一个XXX.pth, 里面添加上test以及test/folder1的绝对路径即可。

 

模块导入比较简单,只要依次填包名就可以了,但注意只要包名
如果需要导入module2,则import folder2.package2.module2

如果需要导入module1,则import package1.module1   注意,路径中没有folder1,因为folder1是文件夹,不是包。


11、GET和POST的区别(在URL上):


GET:










POST






12、render和render_to_response方法区别:

render:http://blog.csdn.net/songyu0219/article/details/52900470?_t_t_t=0.9311686654109508

from django.shortcuts import render

help文档中描述如下:

render(request, template_name, context=None, content_type=None, status=None, using=None)

Returns a HttpResponse whose content is filled with the result of calling django.template.loader.render_to_string() with the passed arguments.

此方法的作用---结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。

通俗的讲就是把context的内容, 加载进templates中定义的文件, 并通过浏览器渲染呈现.

参数讲解:

request: 是一个固定参数, 没什么好讲的。

template_name: templates 中定义的文件, 要注意路径名. 比如'templates\polls\index.html', 参数就要写‘polls\index.html’

context: 要传入文件中用于渲染呈现的数据, 默认是字典格式

content_type: 生成的文档要使用的MIME 类型。默认为DEFAULT_CONTENT_TYPE 设置的值。

status: http的响应代码,默认是200.

using: 用于加载模板使用的模板引擎的名称。


常见的MIME类型(通用型):

超文本标记语言文本 .html text/html
xml文档 .xml text/xml
XHTML文档 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
任意的二进制数据 application/octet-stream

举例


from django.shortcuts import render    def my_view(request):      # View code here...      return render(request, 'myapp/index.html', {          'foo': 'bar',      }, content_type='application/xhtml+xml')  



原创粉丝点击