Django基础

目录

一、基本配置

二、路由系统(urls.py)

三、模板(templates)

Python的WEB框架有Django、Tornado、Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。

一、基本配置

1. 创建django程序

django-admin startproject site-name

使用IDE同样可以创建django程序,其本质也是自动执行上述命令。

其它常用命令:

#启动服务
python manage.py runserver 0.0.0.0
#创建app
django-admin startapp appname
python manage.py startapp appname
#修复SQL的匹配问题,同步数据库,生成管理界面使用的额外的数据库表
python manage.py syncdb
#同步数据库
python manage.py makemigrations
python manage.py migrate
#导入数据
python manage.py dumpdata appname > appname.json
#导入数据
python manage.py loaddata appname.json
#清空数据库
python manage.py flush
#创建超级管理员
python manage.py createsuperuser
#修改密码
python manage.py changepassword username
#Django 项目环境终端
python manage.py shell
#数据库命令行 
python manage.py dbshell
#查看更多命令
python manage.py

 2. 程序目录结构

  • urls.py

   链接入口,关联到对应的 views.py 中的一个函数(或者乘坐 generic 类),访问的链接就对应一个函数。

  • views.py

   处理用户发出的请求,从 urls.py 中对应而来,通过渲染 templates 中的网页可以为用户显示页面内容,比如登录后的用户名,用户请求的数据,通过其输出到页面。

  • models.py

   与数据库操作相关,存入或读取数据时使用。当不使用数据库的时候,也可以当做一般的类封装文件,存储各种类的定义。

  • forms.py

      表单,用户在浏览器上输入提交,对数据的验证工作以及输入框的生成等工作,都依托于此。

  • admin.py

   后台文件,可以用少量的代码就拥有一个强大的后台。

  • settings.py

   Django 的设置、配置文件,比如 DEBUG 的开关,静态文件的位置等等。

  • templates目录

   views.py 中的函数渲染 templates 中的 html 模板,得到动态内容的网页,可以用缓存来提高渲染速度。

3. 配置文件

配置settings.py

  • 新增app须加入以下列表中(注册app)

 

  • 将templates路径加入

  • 配置静态文件路径

  • 配置数据库,python3须使用pymysql替代

二、路由系统(urls.py)

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(r'^home', views.home, name='h1'),
url(r'^index/(d*)', views.index, name='h2'),

设置名称之后,可以在不同的地方调用,如:

模板中使用生成URL     {% url 'h2' 2012 %}
函数中使用生成URL     reverse('h2', args=(2012,))      路径:django.urls.reverse
Model中使用获取URL  自定义get_absolute_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})
get_absolute_url

获取请求匹配成功的URL信息:request.resolver_match

5. 根据app对路由规则进行分类

from django.conf.urls import url, include    # 须导入include

url(r'^web/',include('web.urls')),    # web为app名

6. 命名空间

  •  project.urls.py
from django.conf.urls import url,include
 
urlpatterns = [
    url(r'^a/', include('app01.urls', namespace='author-polls')),
    url(r'^b/', include('app01.urls', namespace='publisher-polls')),
]
  • app01.urls.py
from django.conf.urls import url
from app01 import views
 
app_name = 'app01'
urlpatterns = [
    url(r'^(?P<pk>d+)/$', views.detail, name='detail')
]
  • app01.views.py
def detail(request, pk):
    print(request.resolver_match)
    return HttpResponse(pk)

以上定义带命名空间的url之后,使用name生成URL时候,应该如下:

  • v = reverse('app01:detail', kwargs={'pk':11})
  • {% url 'app01:detail' pk=12 pp=99 %}

django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对应的一个views中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而使路由系统变得简洁。

通过反射机制,为django开发一套动态的路由系统Demo: 点击下载

三、模板(templates)

1. 模板的执行

模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户。

2. 模板语言

模板中也有自己的语言,该语言可以实现数据展示

  • 变量 {{ name }}
  • if判断
基本语法格式如下:
{% if condition %}
     ... display
{% endif %}

或者
{% if condition1 %}
   ... display 1
{% elif condiiton2 %}
   ... display 2
{% else %}
   ... display 3
{% endif %}

根据条件判断是否输出。if/else 支持嵌套。
{% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ),例如:

{% if athlete_list and coach_list %}
     athletes 和 coaches 变量都是可用的。
{% endif %}
  • for循环
{% for item in item_list %}  <a>{{ item }}</a>  {% endfor %}
  •  ifequal/ifnotequal
{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。
下面的例子比较两个模板变量 user 和 currentuser :

{% ifequal user currentuser %}
<h1>Welcome!</h1> {% endifequal %}
  • 注释
{# 这是一个注释 #}
  • 过滤器
模板过滤器可以在变量被显示前修改它,过滤器使用管道字符,如下所示:
{{ 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" %}
  • 模板继承
<html>
  <head>
    <title>Hello World!</title>
  </head>

  <body>
    <h1>Hello World!</h1>
    {% block mainbody %}
       <p>original</p>
    {% endblock %}
  </body>
</html>
base.html

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

{% extends "base.html" %}  #继承母版

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

 3. 自定义filter和simple_tag

  • 在app中创建templatetags模块
  • 创建任意 .py 文件,如:func.py
  •  1 from django import template
     2 
     3 #获得注册对象
     4 register = template.Library()
     5 
     6 
     7 #在自定义的方法前加装饰器
     8 @register.filter
     9 def my_func1(value1, value2):
    10     return value1 + value2
    11 
    12 
    13 @register.filter
    14 def func_if(value):
    15     if value > 0:
    16         return True
    17     else:
    18         return False
    19 
    20 
    21 @register.simple_tag
    22 def my_func2(value1, value2, value3):
    23     return value1 + value2 + value3
    func.py
  •  在使用自定义filter和simple_tag的html文件中导入之前创建的 xx.py 文件名
  • {% load func %}
  • 使用filter和simple_tag
  •  1 {% load func %}
     2 
     3 <!DOCTYPE html>
     4 <html lang="en">
     5 <head>
     6     <meta charset="UTF-8">
     7     <title>Title</title>
     8 </head>
     9 <body>
    10 <h1>filter</h1>
    11 
    12 {#{{ "alex"|my_func1:"-egon" }}<br>#}
    13 {#最多支持2个参数 <br>#}
    14 
    15 {{ "alex"|my_func1:"-egon" }}
    16 
    17 <h1>filter支持作为if语句的条件</h1>
    18 
    19 {% if 10|func_if %}
    20     <h3>True</h3>
    21 {% else %}
    22     <h3>False</h3>
    23 {% endif %}
    24 
    25 <h1>simple_tag</h1>
    26 
    27 {# my_func2 "A" "-B" "-C" <br>#}
    28 {#支持多个参数 <br>#}
    29 
    30 {% my_func2 "A" "-B" "-C" %}
    31 </body>
    32 </html>
    filter和simple_tag应用
  • ps:一定要在settings中配置当前app,不然django无法找到自定义的simple_tag

效果:

参考资料:

1. Python之路【第十六篇】:Django【基础篇】

2. https://www.w3cschool.cn/django/django-template.html#

3. django 中 manage.py通常使用的各种命令大全(包含django 安装指导及测试)

4. https://www.shiyanlou.com/courses/774/labs/2618/document

原文地址:https://www.cnblogs.com/OldJack/p/7076222.html