13.django入门01(django入门初探视图,模板,路由)-创新互联

一、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的工程,目录结构如下:

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

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

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

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

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

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

  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/时,会出现:

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

 所以我们需要为进入这个项目的后台创建超级管理员: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\w*)/(?P\d*)', views.manage),

  3. 添加额外参数:

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

  4. 为url路由设置名称:

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

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

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

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

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

    在一个函数中生成url

    reverse('h3', 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都是标签中           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('')( 只能返回字符串对象!不推荐使用!)

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 }}

此时value2=5。

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

3.3capfirst   首字母大写。

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

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

value3='he  llo wo r ld'

3.5  date    格式化日期字符串。

import datetime

value4=datetime.datetime.now()

{{ value4|date:'Y-m-d' }}

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

{{ value5|default:'空的' }}

#value5=[]

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

3.8 对a标签进行操作:

value6='跳转'

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

3.8字符串操作:

#value7='1234'

{{ value7|filesizeformat }}

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

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

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

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

格式:{% tags %}

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

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

例1:

{% if num >= 100 and 8 %}

  {% if num > 200 %}

    

num大于200

  {% else %}

    

num大于100小于200

  {% endif %}

{% elif num < 100%}

  

num小于100

{% else %}

  

num等于100

{% endif %}

注意!!!

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

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

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

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

    {% for obj in list %}

      

  • ` obj`.`name `
  • {% endfor %}

反向循环:

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

语法格式如下。

  {% for obj in list reversed %}

  ...

  {% endfor %}

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

  {% for country in countries %}

    

` country`.`name `

    

         {% for city in country.city_list %}

          

  • ` city `
  •      {% endfor %}

        

  {% endfor %}

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

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

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

 {% for item in todo_list %}

    

` forloop`.`counter `: ` item `

  {% endfor %}

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

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

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

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

应用场景:

 {% for object in objects %}

     {% if forloop.first %}

  • {% else %}
  • {% endif %}

         ` object `

        

  •   {% endfor %}

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

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

    `li `

       {%  for i in li %}

         

  • ` forloop`.`counter0 `----` i `
  •    {% empty %}

         

  • this is empty!
  •    {% 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 %}

    另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


    网站栏目:13.django入门01(django入门初探视图,模板,路由)-创新互联
    当前地址:http://azwzsj.com/article/ddpgsg.html