13.django入门01(django入门初探视图,模板,路由)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

一、django的基本使用流程。

  1. pip install django #安装django

  2. 创建一个project:

     django-admin startproject mysite

    ---mysite

              ---settings.py

              ---url.py

              ---wsgi.py

           ---- manage.py(启动文件)

  3. 给项目起名字:

    python mannage.py startapp  app01

    django-admin.py 是Django的一个用于管理任务的命令行工具,manage.py是对django-admin.py的简单包装,每一个Django Project里都会有一个mannage.py。

    建一个django工程 : django-admin.py startproject mysite

     当前目录下会生成mysite的工程,目录结构如下:

    wKioL1k_78vChE2BAAB1AZ1RU7A279.png

    manage.py :Django项目里面的工具,通过它可以调用django shell和数据库等。

    settings.py :包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。

    urls.py :负责把URL模式映射到应用程序。

  4. mysite目录下创建blog应用: python manage.py startapp blog

    wKiom1k_8Q3B-qj8AACOUyrWj7A060.png

  5. 注意!!!一定要将settings.py文件中MIDDLEWARE的'django.middleware.csrf.CsrfViewMiddleware'注释掉!!!

  6. 启动一个django项目:

    python manage.py runserver  127.0.0.1:8080

    这样我们的django就启动起来了!当我们访问:http://127.0.0.1:8080/  时就可以看到。

  7. 生成同步数据库的脚本:python manage.py makemigrations  

     同步数据库:  python manage.py migrate

    注意:在开发过程中,数据库同步误操作之后,难免会遇到后面不能同步成功的情况,解决这个问题的一个简单粗暴方法是把migrations目录下,的脚本(除__init__.py之外)全部删掉,再把数据库删掉之后创建一个新的数据库,数据库同步操作再重新做一遍。

  8. 当我们访问http://127.0.0.1:8080/admin/时,会出现:


    wKioL1k_9gWScZyEAALYXoJYNIg400.png


 所以我们需要为进入这个项目的后台创建超级管理员:python manage.py createsuperuser,设置好用户名和密码后便可登录啦!

#admin 是Django 自带的一个后台数据库管理系统。

其他操作:

清空数据库:python manage.py  flush

询某个命令的详细信息: django-admin.py  help  startapp


启动交互界面 :python manage.py  shell

这个命令和直接运行 python 进入 shell 的区别是:你可以在这个 shell 里面调用当前项目的 models.py 中的 API,对于操作数据,还有一些小测试非常方便。

终端上输入python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用。


二、关于django配置文件相关。

  1. 连接数据库。


    DATABASES = {

        'default': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME':'dbname',

        'USER': 'root',

        'PASSWORD': 'xxx',

        'HOST': '',

        'PORT': '',

        }

由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替。

# 如下设置放置的与project同名的配置的 __init__.py文件中

import pymysql

pymysql.install_as_MySQLdb() 


2.配置模板路径

TEMPLATE_DIRS = (

        os.path.join(BASE_DIR,'templates'),

    )


3.配置静态文件路径

STATICFILES_DIRS = (

        os.path.join(BASE_DIR,'static'),

    )


三、django的url路由系统相关。

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。


格式:

urlpatterns = [

    url(正则表达式, views视图函数,参数,别名),

]

#正则表达式就没什么好解释的了。

#views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串。

#后面的那个参数,是传递给视图函数的。(以字典的形式)



  1. 单一路由对应:

    url(r'^index$', views.index),

  2. 基于正则的路由:

    url(r'^index/(\d*)', views.index),

    url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),

  3. 添加额外参数:

    url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),

  4. 为url路由设置名称:


    url(r'^home', views.home, name='h1'),

    url(r'^index/(\d*)', views.index, name='h2'),

    为不同的路由规则设置了名称之后,可以在不同的地方调用这个路由规则:

    比如说模板中,想要在模板中利用这个规则生成url:

    模板中使用生成URL     {% url 'h2' 2012 %}

    在一个函数中生成url

    reverse('h2', args=(2012,))      路径:django.urls.reverse

    还可以在model中获取这个url:


    class NewType(models.Model):

        caption = models.CharField(max_length=16)

        def get_absolute_url(self):

            """

            为每个对象生成一个URL

            应用:在对象列表中生成查看详细的URL,使用此方法即可!!!

            :return:

            """

            # return '/%s/%s' % (self._meta.db_table, self.id)

            # 或

            from django.urls import reverse

            return reverse('NewType.Detail', kwargs={'nid': self.id})


四、views视图函数。

注意!在创建一个view视图函数之前,这个函数一定要接收一个参数,就是request,这个参数中包含了客户端浏览器所有的请求信息!!request这个参数就是用来接收HttpRequest对象的!


在发起一个http请求时,会产生两个对象:

分别是,http请求(HttpRequest对象)以及http响应(HttpResponse对象)


介绍下HttpRequest对象常用的属性和方法。

1.path:       请求页面的全路径,不包括域名。


2.method:     HTTP请求方法,以字符串标识(全大写)例如:

if  req.method=="GET":

        do_something()

if req.method=="POST":

         do_something_else()

3.GET:   包含所有HTTP GET参数的类字典对象


4.POST:包含所有HTTP POST参数的类字典对象


补充!:服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过,HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用if req.POST来判断是否使用了HTTP POST 方法;应该使用  if req.method=="POST"。

注意一个常用方法:request.POST.getlist('')


5.COOKIES:     包含所有cookies的标准Python字典对象;keys和values都是字符串。


6.FILES:      包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中                     name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:

filename:      上传文件名。

content_type:   上传文件的Content Type。

content:       上传文件的原始内容。


6.user:       是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例,你可以通过user的is_authenticated()方法来辨别用户是否登陆:if req.user.is_authenticated()

(只有激活Django中的AuthenticationMiddleware时该属性才可用)


7. session:    唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。



HttpResponse对象常用的方法和属性介绍:

对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。

#HttpResponse类在django.http.HttpResponse中。

在HttpResponse对象上扩展的常用方法:

#return HttpResponse('<input type='text' />')( 只能返回字符串对象!不推荐使用!)

return render(request,'index.html')(推荐)(直接返回一个html文档,第一个参数是视图函数收到的httprequest对象,第二个参数是html文档的文件名,还需要补充一点,就是,这个文件名会到指定的路径下去查找,这个路径是配置文件中已经写好的配置文件名为settings.py)

#render里面2还可以传第三个参数,这个参数就是模板标记!

TEMPLATES = [

    {

        'BACKEND': 'django.template.backends.django.DjangoTemplates',

        'DIRS': [os.path.join(BASE_DIR, 'templates')]


补充!在使用render之前需要:from django.shortcuts import HttpResponse,render


return redirect(“要跳转的url”) #用来做地址跳转!


五、关于Template基础 。

模板语法:

1.变量(使用双大括号来引用变量)。

语法格式:  `var_name`


2.使用.点号来进行变量中数据的深度查找。

在到目前为止的例子中,我们通过 context 传递的简单参数值主要是字符串,然而,模板系统能够非常简洁地处理更加复杂的数据结构,例如list、dictionary和自定义的对象。

#在 Django 模板中遍历复杂数据结构的关键是句点字符 (.)。


例子1:访问模板变量中的列表中的元素。

在python中如果想访问列表中的数据需要使用索引去访问。

在django的模板中,也支持索引的方式,就是用.(点号)。

>>> from django.template import Template, Context

>>> t = Template('Item two is ` items`.`2 `.')  #item这个变量中包含的是个列表,后面的(.2)点2就是取出列表中的第2个元素(和python中一样,元素的索引是从第0个开始。)

>>> c = Context({'items': ['value1', 'value2', 'value3']})

>>> t.render(c)

'Item 2 is value3.'


例子2:假设你要向模板传递一个 Python 字典。 要通过字典键访问该字典的值,也可以通过.点号去取字典中的value。

>>> from django.template import Template, Context

>>> person = {'name': 'bi**h jolin'', 'age': '130'}

>>> t = Template('` person`.`name ` is ` person`.`age ` years old.')

>>> c = Context({'person': person})

>>> t.render(c)

'bi**h jolin is 130 years old.'



例子3:点号在django的模板中还有一个功能,就是访问一个对象的属性。

比如说, Python 的 datetime.date 对象有year 、 month 和 day 几个属性,你同样可以在模板中使用句点来访问这些属性。


>>> from django.template import Template, Context

>>> import datetime

>>> d = datetime.date(1993, 5, 2)

>>> d.year

1993

>>> d.month

5

>>> d.day

2

>>> t = Template('The month is ` date`.`month ` and the year is ` date`.`year `.')

>>> c = Context({'date': d})

>>> t.render(c)

'The month is 5 and the year is 1993.'


例子4:在一个自定义的类中,通过对象后面加上点号,来访问这个对象的某个属性。

>>> from django.template import Template, Context

>>> class Person(object):

...     def __init__(self, first_name, last_name):

...         self.first_name, self.last_name = first_name, last_name

>>> t = Template('Hello, ` person`.`first_name ` ` person`.`last_name `.')

>>> c = Context({'person': Person('bitch', 'jolin')})

>>> t.render(c)

'Hello, bitch jolin.'


点号是可以调用python内部所有对象的属性或者方法的!!!这点特别灵活!!!

>>> from django.template import Template, Context

>>> t = Template('` var ` -- ` var`.`upper ` -- ` var`.`isdigit `')

>>> t.render(Context({'var': 'hello'}))

'hello -- HELLO -- False'

>>> t.render(Context({'var': '123'}))

'123 -- 123 -- True'


but!!注意这里调用方法时并* 没有* 使用圆括号 而且也无法给该方法传递参数;你只能调用不需参数的!!!


3.模板中变量的过滤器(filter):

语法格式:      {{obj|filter:param}}


3.1 add 给一个变量值做加法。

{{ value2|add:3 }}<br>

此时value2=5。


3.2addslashes   给变量中的引号前加斜线。


3.3capfirst    首字母大写。


3.4 cut   从字符串中移除指定的字符。

{{ value3|cut:' ' }}<br> #以空行为分隔符

value3='he  llo wo r ld'

3.5  date      格式化日期字符串。

import datetime

value4=datetime.datetime.now()

{{ value4|date:'Y-m-d' }}<br>



3.6 default     如果值是False,就替换成设置的默认值,否则就是用本来的值。

{{ value5|default:'空的' }}<br>

#value5=[]

3.7 default_if_none:  如果值是None,就替换成设置的默认值,否则就使用本来的值。


3.8 对a标签进行操作:

value6='<a href="#">跳转</a>'

{{ value6|safe }}<br> #如果外面包了其他的标签,比如说h1标签,让浏览器强制解释为A标签。


3.8字符串操作:

#value7='1234'

{{ value7|filesizeformat }}<br> 

{{ value7|first }}<br> #取字符串的第一个字符

{{ value7|length }}<br> #取字符串的长度

{{ value7|slice:":-1" }}<br>  #切片


4.模板中签(tag)的使用(使用大括号和百分比的组合来表示使用tag)

格式:{% tags %}


4.1 if判断标签:{% if %}

{% if %}标签计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值,系统则会显示{% if %}和{% endif %}间的所有内容。

例1:

{% if num >= 100 and 8 %}

    {% if num > 200 %}

        <p>num大于200</p>

    {% else %}

        <p>num大于100小于200</p>

    {% endif %}

{% elif num < 100%}

    <p>num小于100</p>

{% else %}

    <p>num等于100</p>

{% endif %}


注意!!!

{% if %} 标签接受and,or或者not来测试多个变量值或者否定一个给定的变量

{% if %} 标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义!!!!


4.2 for循环判断标签:{% for %}

{% for %}标签允许你按顺序遍历一个序列中的各个元素,每次循环模板系统都会渲染{% for %}和{% endfor %}之间的所有内容。

<ul>

{% for obj in list %}

    <li>` obj`.`name `</li>

{% endfor %}

</ul>


反向循环:

django模板还支持在标签里添加reversed来反序循环列表:

语法格式如下。

    {% for obj in list reversed %}

    ...

    {% endfor %}


for循环标签也是可以嵌套的:

    {% for country in countries %}

        <h1>` country`.`name `</h1>

        <ul>

         {% for city in country.city_list %}

            <li>` city `</li>

         {% endfor %}

        </ul>

    {% endfor %}


注意!!django模板中的for循环不支持continue和break!!


{% for %}标签内置了一个forloop模板变量,这个变量含有一些属性可以提供给你一些关于循环的信息。

forloop.counter表示循环的次数,它从1开始计数,第一次循环设为1

  {% for item in todo_list %}

        <p>` forloop`.`counter `: ` item `</p>

   {% endfor %}


forloop.counter0 功能与forloop.counter是一样的,但它是从0开始计数,第一次循环设为0。


forloop.revcounter 倒序计数,一直到1

forloop.revcounter0 倒序计数,一直到0


forloop.first当第一次循环时值为True。

应用场景:

 {% for object in objects %}   

         {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}   

         ` object `   

        </li>  

    {% endfor %}  


注意!forloop变量只能在循环中得到,当模板解析器到达{% endfor %}时forloop就会失去作用。


当本次循环取不到值时,执行{% empty %}标签下的操作:

`li `

      {%  for i in li %}

          <li>` forloop`.`counter0 `----` i `</li>

      {% empty %}

          <li>this is empty!</li>

      {% endfor %}

 



4.3{%csrf_token%}:csrf_token标签(一种安全机制)。

用于生成csrf_token的标签,用于防治跨站攻击验证。注意如果你在view的index里用的是render_to_response方法,不会生效。

原理就是会生成一个input标签,和其他表单标签一起提交给后台的。



4.4{% with %}:用更简单的变量名替代复杂的变量名.

{% with total=fhjsaldfhjsdfhlasdfhljsdal %} ` total ` {% endwith %}

这个变量名只在with标签中生效!



4.5{% verbatim %}: 禁止render,模板中的变量不会被解析。

{% verbatim %}

         ` hello `

{% endverbatim %}



      本文转自苏浩智 51CTO博客,原文链接:http://blog.51cto.com/suhaozhi/1937299,如需转载请自行联系原作者







相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
监控 安全 应用服务中间件
python中Django入门(四)
python中Django入门(四)
31 0
|
3月前
|
SQL 前端开发 JavaScript
Python 教程之 Django(10)模板
Python 教程之 Django(10)模板
34 0
|
4月前
|
Python API 网络架构
Django实践-10RESTful架构和DRF入门
Django实践-10RESTful架构和DRF入门
Django实践-10RESTful架构和DRF入门
|
9天前
|
开发者 Python
Django模板系统的强大之处:动态渲染与扩展性
【4月更文挑战第15天】Django模板系统是Web开发中的强大工具,支持动态渲染和扩展性。动态渲染包括变量、标签和过滤器的使用,实现内容根据上下文数据动态生成。模板继承和自定义标签则提升了扩展性,减少代码重复,增强可维护性。通过这些特性,Django模板系统助力开发者构建高效、动态的Web应用。
|
1月前
|
中间件 数据安全/隐私保护 Python
python中Django入门(三)
python中Django入门(三)
17 0
|
1月前
|
前端开发 JavaScript Shell
python中Django入门(二)
python中Django入门(二)
13 0
|
1月前
|
SQL Shell 数据库
python中Django入门(一)
python中Django入门(一)
28 0
|
3月前
|
前端开发 JavaScript Python
Django 模板中使用 Ajax POST
Django 模板中使用 Ajax POST
17 0
|
3月前
|
Shell 数据库 Python
Python 教程之 Django(6)视图类型
Python 教程之 Django(6)视图类型
21 0
Python 教程之 Django(6)视图类型
|
3月前
|
XML 前端开发 JavaScript
Python 教程之 Django(5)视图基础
Python 教程之 Django(5)视图基础
28 1
Python 教程之 Django(5)视图基础