Django-基础-1

Django 的学习
https://www.cnblogs.com/yuanchenqi/articles/8875659.html
https://www.cnblogs.com/yuanchenqi/articles/7629939.html
http://www.cnblogs.com/haiyan123/p/7701412.html

MTV 模型
    M  model      (负责业务对象和数据库的关系映射)(orm)
    T  template   (存放html,负责把页面展示给用户)
    V  view          (视图,负责业务逻辑,在适当的时候调用model和template)
    Django 有一个URL控制器(路径和函数关系的映射,pattern),根据URL  pattern  来分发给不同的view函数处理,view调用相应的model和template 返回页面给用户
一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。

django  的安装
pip3 install django(目前最新版本是2.0)
我们上课的时候用的是1.x版本,所以这里我也装1.11版本的
pip3 install django==1.11
django 是下载在python3 解释器的lib 目录下面了
下载完成后会看到我们的scripts 多了django-admin.exe   django-admin.py

使用django-admin.py startproject myproject 创建项目
使用cd myproject && python3 manage.py startapp app01 创建应用
我们使用命令行或者是pycharm 创建一个项目,项目名是Myproject,然后我们再创建一个应用的名字app01
创建完成之后的目录结构是这样的

myproject-------------------------->这个是项目名,可以更改
    app01-------------------------->项目应用的名称,我们要是有多个应用这里我们还可以有app02,app03
        migrations
            __init__.py
            admin.py
            models.py
            tests.py
            views.py
    myproject----------------------->这个名字不可更改,这里的配置是应用于全局配置的
        __init__.py
        settings.py----------------->存放项目的配置文件
        urls.py--------------------->路径和视图函数的映射关系,看urlpatterns字典,当应用很多的时候,我们应该在每个应用里面创建一个urls.py
        wsgi.py--------------------->和socket相关
    templates----------------------->存放各种html文件,css,js 会放在新的static文件夹
    manage.py----------------------->与Django项目进行交互的脚本,启动的时候我们执行python manage.py runnserver IP PORT,默认8000端口

这里我们分不同的应用是为了解耦
url 匹配规则自上而下。上面匹配上了,不再往下匹配

HttpResponse :封装响应体的类,返回任何数据,都应该放在HttpResponse里返回

这里举例我们的url 路径是timer  那么就会匹配上这一条规则 url(r'^timer/', views.timer),就去执行
视图函数中的timer(形参xxx)函数,传入一个request 实参,request 包含所有的请求信息,当我们请求的时候
Django中的wsgi把所有的请求信息封装成request对象,封装好之后立马传给timer,timer 函数要是利用任何一个
request 的任意一个对象信息的时候直接从request对象里取就可以了

render : render(request, template_name[, context])
    结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
    按照settings配置指定的路径找到html 文件
参数:
     request: 用于生成响应的请求对象。
     template_name:要使用的模板的完整名称,可选的参数,这里我们直接templates目录下的html文件名即可,因为在setting.py 中 TEMPLATES 列表配置了templates的环境变量,'DIRS': [os.path.join(BASE_DIR,'templates')]
     context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
     content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
     status:响应的状态码。默认为200。
     render 其实最终也是调用的HttpResponse

    ctime = str(time.time())
    name = 'bigbao'
    age = '18'
    return render(request,"time.html",{'ctime':ctime,'name':name,'age':age})
    这里的“ctime” key 是html模板中要引用的,ctime是上面函数取到的

模板语法: 目的是将变量(数据库的内容)如何巧妙的嵌入到html页面中(就不用之前我们用的字符串拼接了)
在 Django 模板中遍历复杂数据结构的关键是句点字符,语法:
{{var_name}}   

render 方法有两个功能:
                    返回一个页面
                    模板语法:将变量巧妙的嵌入html页面中
return HttpResponse("访问成功") 返回的一定是一个字符串,如果想返回纯字符串,就用HttpResponse方法


我们在post数据的时候我们可以再request.POST 对象里面取到我们提交的数据
比如说我们在form表单里提交了我们input里定义的两个input元素名称 user_name 和 pwd,那么我们就可以再request.post.get('user_name')
和request.post.get('pwd') 取到相应的值



URL控制器
    url组成部分:
        协议://ip(域名):端口/路径?参数
    url的功能: url路径和视图函数的映射关系
    1、一旦匹配成功则不再继续
    2、若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),

    # 无名分组:
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive)  给函数传入两个实参

    # 有名分组(就是给分组起个名字,这样定义的好处就是按照关键字参数去传参了,指名道姓的方式)语法:(?P<name>pattern)
    url(r'^article/(?P<year>\d{4})/(?P<month>\d{2})$', views.year_month_hasname),这样函数year_month_hasname里会有两个形参的名字是year和moth和位置无关


    URL 分发:
        这里我们应该解耦,我们可以把每个URL pattern 放在自己的应用下面,在我们自己的应用下面创建一个urls.py文件
        全局配置的urls.py 需要配置如下
        from django.conf.urls import url,include
        url(r'^app01/', include('app01.urls'))    也就是说访问路径以app01 开头的路径都到app01 下面的的urls去匹配规则

    URL 反射:我们把我们的url路径加上一个别名,然后直接调用别名路径,这样我们以后修改URL路径的时候别名不改,改动就小了,不然的话改动太大
        url(r'^login/',name=xxxxx),这样我们以后修改url 的时候,这里我们以后修改路径的时候我们直接修改成如下:
        url(r'^login.hhhtml/',name=xxxxx)   反向解析
        
        这样我们在模板语法中标签怎么调用这个变量呢,
        <form action="{% url 'xxxxx' %}" method="post"> 我们就会跳到login.hhhtml/页面了,我们不需要修改其他的东西
        这里我们去找别名是 xxxxx 的URL,然后我们找到的是   login.hhhtml ,然后把login.hhhtml/ 放到action里面,把{% url 'xxxxx' %} 换成  login.hhhtml/



视图函数
    1 request 对象
        request.GET 
        request.POST
        request.method
        request.path
        request.get_full_path()

    2 HttpResponse
        Django 必须相应HttpResponse 对象
        HttpResponse  用来相应字符串
        render           用来响应模板
        redirect      重定向 from django.shortcuts import render,HttpResponse,redirect
        比如说我们登录成功之后给我们重定向到首页
        return redirect('/index/')


模板语法  http://www.cnblogs.com/haiyan123/p/7725568.html
    变量渲染{{ }}
        深度查询:
            说到底就是利用句点符来操作
            传入列表的时候,我们html 中变量引用的时候用{{ list.3 }}
            传入字典的时候,html 模板语法中用  {{ dict.key }}

        过滤器:
            语法: {{obj|filter__name:param}}
            default 过滤器:
            date 过滤器:{{ value|date:"Y-m-d" }}  
            length 过滤器:{{ value|length }}
            filesizeformat 过滤器:{{ value|filesizeformat }}
            slice 过滤器:{{ value|slice:"2:-1" }}
            truncatechars 过滤器:{{ content|truncatechars:20 }}

    标签渲染{ %% }
        for 循环标签  我么可以用到{{ forloop.counter }} 来添加数字,需在for循环内用,我们要是循环字典我们可以利用dict.items
            <ul>
                {% for book in book_list %}
                    <li>{{ book }}</li>
                {% endfor %}
            </ul>

        if 标签
        {% for foo in score %}
            {% if foo > 100 %}
                <p> {{ foo }}</p>
            {% endif %}
        {% endfor %}

静态文件的引入:
# 别名,以后实际用的时候用的是这个别名,STATICFILES_DIRS 是Django用的,STATICFILES_DIRS 和 STATIC_URL 必须都存在,结合使用的
# 我们在用STATIC_URL别名的时候,Django 会自己去找到他的实际路径,我们在html应用静态文件的时候必须用别名,比如
# <script src="/static/jquery.js"></script>   这个就是我静态文件应用的格式
# 下面这个两个是在setting.py 文件里面配置的
STATIC_URL = '/static/'

# 文件的实际存在目录,必须叫STATICFILES_DIRS
STATICFILES_DIRS=[os.path.join(BASE_DIR,"static")]



模板的继承
我们写一个继承模板base.html
    继承模板里的
    {% block content %}
        继承模板的内容
    {% endblock content %}


    然后我们在我们的子模板里,首行加上{% extends 'base.html' %}
    然后在html 文件中写入

    {% block content %}
        自己的独特内容,这种情况下会覆盖父模板的内容,我么可以加上{{ block.super }},父模板的内容在子模板也出现
    {% endblock content %}



ORM
http://www.cnblogs.com/yuanchenqi/articles/8933283.html

有几个问题:
    1、python3 我们用的数据库链接用的是pymysql,所以这里我们在全局的__init__.py 文件或者是工程的__init__.py 文件加上如下两句话
        import pymysql
        pymysql.install_as_MySQLdb()
    2、然后把配置文件setting.py 中的DATABASES 的sqlite3 换成mysql
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'NAME':'orm',# 要连接的数据库,连接前需要创建好
                'USER':'root',# 连接数据库的用户名
                'PASSWORD':'abcd1234',# 连接数据库的密码
                'HOST':'10.10.20.17',# 连接主机,默认本级
                'PORT': 3306 #  端口 默认3306
            }
        }
    3、models.py 中 创建 表的类    
        class Book(models.Model):
            id = models.AutoField(primary_key=True)
            title = models.CharField(max_length=32)
            state = models.BooleanField()
            pub_date = models.DateField()
            price = models.DecimalField(max_digits=8, decimal_places=2)
            publish = models.CharField(max_length=32)    

    4、初始化数据库
        python manage.py makemigrations  (这一步就报错了)
        python manage.py migrate
        在执行初始化数据库的时候遇到
        No changes detected
        然后按照网上的方法,python manage.py makemigrations app01 ,同时在setting.py 里的INSTALLED_APPS添加一行'app01'
        然后再去删除相应的缓存,再执行
        python manage.py makemigrations app01
        python manage.py migrate

 

posted @ 2018-08-24 14:26  BigBao的博客  阅读(170)  评论(0编辑  收藏  举报