django~1

Posted 你是我的神奇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django~1相关的知识,希望对你有一定的参考价值。

http://www.cnblogs.com/yuanchenqi/articles/6083427.html

本节内容:

1:MVC和MTV是什么

2:django命令

3:Django的配置文件(settings)

4:Django URL (路由系统)

5:Django Views(视图函数) ~V 

6:Django Template基础  ~T

7:Django Model基础 ~M

8:Django Admin

 

1:MVC和MTV是什么

著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层;他们之间以一种插件似的,松耦合的方式连接在一起。

模型负责业务对象与数据库的对象(ORM);
视图负责与用户的交互(页面);
控制器(C)接受用户的输入调用模型和视图完成用户的请求。

 

Django的MTV模式本质上与MVC模式没有什么差别,也是各组件之间为了保持松耦合关系,只是定义上有些许不同,Django的MTV分别代表:

Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template

此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

注意的是:

在MVC中的V视图是代表着--->html文件。而在MTV中的V是一个个的函数视图。

def index(request):

    return render(request,"base.html")

 2:django常用命令

安装: pip3 install django

django-admin startproject sitename  ##创建project  

python manage.py runserver 0.0.0.0 ##启动服务
python manage.py startapp appname  ##创建app 
python manage.py syncdb
python manage.py makemigrations  ##数据库
python manage.py migrate

python manage.py createsuperuser

 import django
 django.VERSION ##查看django的版本是多少
 pip3 install django --upgrade # #升级django
 pip3 uninstall django ##卸载django

3:Django的静态文件(settings)

a:setting配置文件要有django.contrib.staticfiles\'

INSTALLED_APPS = [
    \'django.contrib.admin\',
    \'django.contrib.auth\',
    \'django.contrib.contenttypes\',
    \'django.contrib.sessions\',
    \'django.contrib.messages\',
    \'django.contrib.staticfiles\',
    "app01",
]
View Code

b:setting文件的STATIC_URL

STATIC_URL = \'/static/\'    ##使用的时候只能是采用别名的方式去引用静态文件: 
STATICFILES_DIRS = (
    os.path.join(BASE_DIR,"statics"),
    # os.path.join(BASE_DIR,"blog","statics"),  ##一个app对应一个静态文件
)
View Code

c:在template目录的html文件中 使用

##第一种
<script src="/static/jquery-3.3.1.min.js"></script>

#第二种
{% load staticfiles %}  ##首行
<script src="{% static "jquery-3.3.1.min.js" %}"></script>
View Code

 4:Django URL (路由系统)

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

urlpatterns = [

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

参数说明:

  • 一个正则表达式字符串
  • 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
  • 可选的要传递给视图函数的默认参数(字典形式)
  • 一个可选的name参数

传递的参数始终是字符串


from
django.conf.urls import url from app01 import views urlpatterns = [ # 一般 url(r\'^articles/2003/$\', views.special_case_2003), url(r\'^articles/([0-9]{4})/$\', views.year_archive), url(r\'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$\', views.month_archive), # 路由分发 url(r\'^contact/\', include(\'django_website.contact.urls\')), # 传给视图的默认参数,对应的视图函数也必须加上同名的参数 url(r\'^blog/(?P<year>[0-9]{4})/$\', views.year_archive, {\'foo\': \'bar\'}), #name参数 别名 url(r\'^index\',views.index,name=\'bieming\'), ##<a href="{% url "bieming" %}">click me</a> ]

5:Django Views(视图函数)

当一个请求来了,会对应的去匹配app 里面view视图函数。而一个view视图即一个请求的过程。

http请求中产生两个核心对象:

        http请求:HttpRequest对象

        http响应:HttpResponse对象

1 HttpRequest对象的属性和方法:

 path:       请求页面的全路径,不包括域名
#
# method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如
#
#                    if  req.method=="GET":
#
#                              do_something()
#
#                    elseif req.method=="POST":
#
#                              do_something_else()
#
# GET:         包含所有HTTP GET参数的类字典对象
#
# POST:       包含所有HTTP POST参数的类字典对象
#
#              服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过
#              HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用
#              if req.POST来判断是否使用了HTTP POST 方法;应该使用  if req.method=="POST"
#
#
#
# COOKIES:     包含所有cookies的标准Python字典对象;keys和values都是字符串。
#
# FILES:      包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中                     name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
#
#             filename:      上传文件名,用字符串表示
#             content_type:   上传文件的Content Type
#             content:       上传文件的原始内容
#
#
# user:       是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
#              没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
#              可以通过user的is_authenticated()方法来辨别用户是否登陆:
#              if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
#              时该属性才可用
#
# session:    唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。

#方法
get_full_path(),   比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()得到的结果就是/index33/?name=123
req.path:/index33
View Code

2 HttpResponse对象:

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

  HttpResponse类在django.http.HttpResponse

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

页面渲染:render,render_to_response(不需要加request)
其本质就是调用的:HttpResponse

页面跳转:redirect

locals: 可以直接将函数中所有的变量传给模板
from django.shortcuts import render,render_to_response,redirect
from django.shortcuts import HttpResponse

def index(request):

    # return render(request,"base.html")
    # return render_to_response("base.html")
    return  redirect("/register/")
    # return HttpResponse("SUCCESS")
View Code

 6:Django Template基础

Django的template目录中的html文件是包括了html标签和template语言的。
在发送response响应给客户端,要先将template模版语言html标签进行渲染之后才发送给客户端。

模板语法

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

语法格式:       {{var_name}}

a:Template和Context对象(了解)

>>> python manange.py shell  (进入该django项目的环境)
>>> from django.template import Context, Template
>>> t = Template(\'My name is {{ name }}.\')
>>> c = Context({\'name\': \'Stephane\'})
>>> t.render(c)
\'My name is Stephane.\'


# 同一模板,多个上下文,一旦有了模板对象,你就可以通过它渲染多个context,无论何时我们都可以
# 像这样使用同一模板源渲染多个context,只进行 一次模板创建然后多次调用render()方法渲染会
# 更为高效:
# Low
for name in (\'John\', \'Julie\', \'Pat\'):
    t = Template(\'Hello, {{ name }}\')
    print t.render(Context({\'name\': name}))

# Good
t = Template(\'Hello, {{ name }}\')
for name in (\'John\', \'Julie\', \'Pat\'):
    print t.render(Context({\'name\': name}))
View Code

我们对Template和Context对象的了解之后,基本是不用这个的:而是直接用render

def current_time(req):

    now=datetime.datetime.now()

    return render(req, \'current_datetime.html\', {\'current_date\':now})
View Code

b:万能的点(.)

view可以template中传递的数据类型:
列表、字典、元组、字符串、数字....

而要使用如字典还有列表等数据格式。采用点(.)

######view###########
class foo:
    def __init__(self,a):
        self.a = a

def register(request,FOO):
    person = {"name":\'cfp\',"age":22,"hobby":"gril"}
    l = [1,2,3]
    str1  = "hello"
    num = 10
    c = foo(\'xx\')
    return render(request,"register.html",locals())

    
#########register.html##########
<body>

{{ person.age }} #22
{{ c.a }}     ##xx 
{{ str1 }}     ##hello

</body>
    
View Code

c:变量的过滤器(filter)的使用

语法格式:      {{obj|filter:param}}
# 1  add          :   给变量加上相应的值
   #
   # 2  addslashes   :    给变量中的引号前加上斜线
   #
   # 3  capfirst     :    首字母大写
   #
   # 4  cut          :   从字符串中移除指定的字符
   #
   # 5  date         :   格式化日期字符串
   #
   # 6  default      :   如果值是False,就替换成设置的默认值,否则就是用本来的值
   #
   # 7  default_if_none:  如果值是None,就替换成设置的默认值,否则就使用本来的值


#实例:

#value1="aBcDe"
{{ value1|upper }}<br>

#value2=5
{{ value2|add:3 }}<br>

#value3=\'he  llo wo r ld\'
{{ value3|cut:\' \' }}<br>

#import datetime
#value4=datetime.datetime.now()
{{ value4|date:\'Y-m-d\' }}<br>

#value5=[]
{{ value5|default:\'空的\' }}<br>

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

{{ value6 }}

{% autoescape off %}
  {{ value6 }}
{% endautoescape %}

{{ value6|safe }}<br>

{{ value6|striptags }}

#value7=\'1234\'
{{ value7|filesizeformat }}<br>
{{ value7|first }}<br>
{{ value7|length }}<br>
{{ value7|slice:":-1" }}<br>

#value8=\'http://www.baidu.com/?a=1&b=3\'
{{ value8|urlencode }}<br>
    value9=\'hello I am yuan\'
View Code

2:标签(tag)的使用(使用大括号和百分比的组合来表示使用tag)

{% tags %}

a:{% if %} 的使用 

{% 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,否则逻辑容易产生歧义,例如下面的标签是不合法的:

{% if obj1 and obj2 or obj3 %}
View Code

b:{% for %}的使用

<ul>
{% for obj in list %}
    <li>{{ obj.name }}</li>
{% endfor %}
</ul>



#在标签里添加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 %}


#系统不支持中断循环,系统也不支持continue语句,{% for %}标签内置了一个forloop模板变量,
#这个变量含有一些属性可以提供给你一些关于循环的信息

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

    {% for item in todo_list %}
        <p>{{ forloop.counter }}: {{ item }}</p>
    {% endfor %}
2,forloop.counter0 类似于forloop.counter,但它是从0开始计数,第一次循环设为0
3,forloop.revcounter
4,forloop.revcounter0
5,forloop.first当第一次循环时值为True,在特别情况下很有用:

    
    {% for object in objects %}   
         {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}   
         {{ object }}   
        </li>  
    {% endfor %}  
    
# 富有魔力的forloop变量只能在循环中得到,当模板解析器到达{% endfor %}时forloop就消失了
# 如果你的模板context已经包含一个叫forloop的变量,Django会用{% for %}标签替代它
# Django会在for标签的块中覆盖你定义的forloop变量的值
# 在其他非循环的地方,你的forloop变量仍然可用


#{% empty %}

{{li }}
      {%  for i in li %}
          <li>{{ forloop.counter0 }}----{{ i }}</li>
      {% empty %}
          <li>this is empty!</li>
      {% endfor %}

#         [11, 22, 33, 44, 55]
#            0----11
#            1----22
#            2----33
#            3----44
#            4----55
View Code

c:{%csrf_token%}:csrf_token标签

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

     其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的。

<form action="/register/" method="post">
    <input type="text" name="user">
    <input type="password" name="pwd">
    <input type="submit">
    {% csrf_token %}
</form>
View Code

d:{% url %}:  引用路由配置的地址

<form action="{% url "bieming"%}" >
          <input type="text">
          <input type="submit"value="提交">
          {%csrf_token%}
</form>
View Code

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

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

f:{% verbatim %}: 禁止render

{% verbatim %}
         {{ hello }}
{% endverbatim %}

###不将 hello进行渲染,本文内容就是 {{hello}}

g:{% load %}: 加载标签库  

3:自定义变量过滤(filter)和标签(simple_tag)

a、在app中创建templatetags模块(必须的)

b、创建任意 .py 文件,如:my_tags.py

from django import template
from django.utils.safestring import mark_safe

register = template.Library()   #register的名字是固定的,不可改变

@register.filter
def  filter_multi(x,y,):
    return x*y


@register.simple_tag
def simple_multi(x,y,z):
    return x**y*z
View Code

c、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}

d、使用simple_tag和filter(如何调用)

-------------------------------.html
{% load xxx %}   #首行
    
    
    
    
 # num=12
{{ num|filter_multi:2 }} #24   ##只能有一个参数

{{ num|filter_multi:"[22,333,4444]" }}


{% simple_tag_multi 2 5 %}   #参数不限,但不能放在if for语句中
{% simple_tag_multi num 5 %}
View Code

e、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

4: extend模板继承

母html:{% block content %} {% endblock %}  ##block越多越好,block也可以叫做钩子

子html:
    {% extends "base.html" %}  ##必须在html页面的首行
    
    {% block content %}  ##要修改的内容都在block包含,其他都是一样的
    {{ block.super }}  ##执行母版中的block中的内容
        内容。。。
    {% endblock %}
    
    我觉的一个html文件内容写的很好。想直接内嵌到自己的html文件中:
    1:{% load staticfiles %}
    2:{% include "test.html" %}
{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<style>
    *{
        margin: 0;
        padding: 0;
    }
    .nav {
        line-height: 40px;
        width: 100%;
        height: 40px;
        background-color: #2459a2;
        color: white;
        font-size: 20px;
        text-align: center;

    }
    .left {
         width: 20%;
         background-color: lightblue;
         min-height: 694px;
        overflow: hidden;
        float: left;
    }
    .manage {
        text-align: center;
        padding: 15px 0;
        margin: 20px 0;
        font-size: 20px;
        color: white;
    }
    a {
        text-decoration: none;
    }
    .content {
        width: 80%;
        min-height: 694px;
        display: inline-block;
        float: left;
    }
    h1 {
        text-align: center;
    }
</style>
   {% block css %}

   {% endblock %}
<body>

<div class="outer">
    <div class="nav">标题</div>
    <div class="left">
        <div class="student manage"><a href="/student/">学生管理</a></div>
        <div class="teacher manage"><a href="">老师管理</a></div>
        <div class="class manage"><a href="">班级管理</a></div>
        <div class="course manage"><a href="">课程管理</a></div>
    </div>
    <div class="content">
        {% block content %}
            <h1>WELCOME TO MANAGE </h1>{% block manage %} {% endblock %}
        {% endblock %}

    </div>
</div>



<script src="/static/jquery-3.3.1.min.js"></script>

<script src="{% static "jquery-3.3.1.min.js" %}"></script>
<script>
    $("h3").css("color","red")
</script>

</body>
</html>
base.html
{% extends "base.html" %}
{% load staticfiles %}


{% block css %}
    <style>
        H1,h2 {
            text-align: center;
        }
    </style>
{% endblock %}

{% block content %}
    {{ block.super }}{% block manage %}FOR STUDENT MANAGE{% endblock %}
    {% for item in student_list %}
       <h2>学生:{{ item }}</h2>
    {% endfor %}
    {% include "test.html" %}
{% endblock %}
student.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>hello world</h1>

</body>
</html>
test.html

 7:Django Model基础 ~M

一、表与表之间的关系

一对一  一个外键加字段的unique 
一对多  一个外键
多对多  两个外键 

二、django的ORM 

ORM(Object relation mapping)对象关系映射,把用python的一个类去对应数据库里面的一个表,用于实现面向对象编程语言里不同类型系统的数据之间的转换,换言之,就是用面向对象的方式操作数据库创建表以及增删改查等操作

优点:

1 :ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句。快速开发,由此而来。

2 :可以避免一些新手程序猿写sql语句带来的性能问题。

注意:没有ORM我们一样是可以对数据库进行操作的:无非就是在view里面导入模块,创建游标

import pymysql
def index(request):
    conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password=\'\',database=\'\')
    cursor = conn.cursor()
    cursor.execute("select * from t1;")  
    data = cursor.fetchall()
    print(data)
    conn.commit()
    cursor.close()
    conn.close()
    return render(request,"base.html")
View Code

 三、Model数据库的配置

1    django默认支持sqlite,mysql, oracle,postgresql数据库。

     <1> sqlite

            django默认

以上是关于django~1的主要内容,如果未能解决你的问题,请参考以下文章

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

Django REST框架--认证和权限

如何在 Django 中显式重置模板片段缓存?

使用 Django 模板作为片段

python 通过django片段很多很多

JavaScript 片段在 Django 模板中不起作用