zoukankan      html  css  js  c++  java
  • Django 教程

    Django 安装

    windows安装Django,pip安装,cmd命令进入命令行,输入下面命令,pip版本需要升级,按照提示升级

    pip3 install Django==2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
    

      -i https://pypi.tuna.tsinghua.edu.cn/simple 指定清华镜像源,下载速度更快。

    Pycharm安装

    file ---> settings ----> project 解释器 ---> 点击+ ----> 输入Django ---> install(如果选择版本时,选择 CheckBox ,选择指定版本)

      

    Django 创建项目

    安装 Django 之后,已经有了可用的管理工具 django-admin.py,cmd命令下输入客园查看对应命令

    使用 django-admin.py 来创建 HelloWorld 项目,cd到对应目录下进行执行

    目录说明:

    • HelloWorld: 项目的容器。
    • manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
    • HelloWorld/__init__.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
    • HelloWorld/asgi.py: 一个 ASGI 兼容的 Web 服务器的入口,以便运行你的项目。
    • HelloWorld/settings.py: 该 Django 项目的设置/配置。
    • HelloWorld/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
    • HelloWorld/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。

    接下来我们进入 HelloWorld 目录输入以下命令,启动服务器:

    python manage.py runserver 0.0.0.0:9000
    

    0.0.0.0 让其它电脑可连接到开发服务器,9000 为端口号。如果不说明,那么端口号默认为 8000。

    在浏览器输入你服务器的 ip(这里我们输入本机 IP 地址: 127.0.0.1:8000) 及端口号,如果正常启动,输出结果如下:

    视图和URL配置

    在先前创建的 HelloWorld 目录下的 HelloWorld 目录新建一个 views.py 文件,并输入代码: 

    from django.http import HttpResponse
     
    def hello(request):
        return HttpResponse("Hello world ! ")
    

    接着,绑定 URL 与视图函数。打开 urls.py 文件

    from django.contrib import admin
    from django.urls import path
    from . import views 
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('hello/', views.hello),
    ]
    

    完成后,启动 Django 开发服务器,并在浏览器访问打开浏览器并访问:

    Django 模板

    模板是一个文本,用于分离文档的表现形式和内容

    在 HelloWorld 目录底下创建 templates 目录并建立 index.html文件 

    index.html 文件代码如下,模板中我们变量使用了双括号

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
    <h1>{{ hello }}</h1>
    </body>
    </html>
    

    接下来我们需要向Django说明模板文件的路径,修改HelloWorld/settings.py,修改 TEMPLATES 中的 DIRS 为 [BASE_DIR, "/templates",],如下所示:

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
    		'DIRS': [os.path.join(BASE_DIR, 'templates')], # 修改地方
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    

    现在修改 views.py,增加一个新的对象,用于向模板提交数据:

    from django.shortcuts import HttpResponse, render
    
    
    def index(request):	
    	context = {}
    	context['hello'] = 'Hello World!'
    	return render(request, 'index.html', context)  

    现在修改 urls.py,增加一个新的路由

    from django.contrib import admin
    from django.urls import path
    from . import views 
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/', views.index),
    ]
    

    其中,context 字典中元素的键值 hello 对应了模板中的变量 {{ hello }}。

    再次访问页面

     这样我们就完成了使用模板来输出数据,从而实现数据与视图分离。

    Django 模板标签

    模板语法: 

    view:{"HTML变量名" : "views变量名"}
    HTML:{{变量名}}

    编辑views.py文件

    def index(request):
        views_name = "Python"
        return render(request, 'index.html', {"views_name": views_name})

    templates 中的 index.html :

    <p>{{ views_name }}</p>

    再次访问服务器:http://127.0.0.1:8000/index/

    列表:templates 中的 index.html中,可以用 . 索引下标取出对应的元素。

    字典:templates 中的 index.html中,可以用 .键 取出对应的值。

    views.py代码:

    def index(request):
        views_name = "Python"
        views_list = ["Java", "Python", "Go"]
        views_dict= {"name": "Python"}
        return render(request, 'index.html', {"views_name": views_name,
                                              "views_list": views_list,
                                              "views_dict": views_dict, })

    index.html代码:

    <p>{{ views_list }}</p> # 取出整个列表
    <p>{{ views_list.0 }}</p> # 取出列表的第一个元素
    <p>{{ views_dict }}</p>
    <p>{{ views_dict.name }}</p>

    访问 http://127.0.0.1:8000/index,可以看到页面:

    过滤器

    语法:

    {{ 变量名 | 过滤器:可选参数 }}

    模板过滤器可以在变量被显示前修改它,过滤器使用管道字符。

        path('filterdemo/', views.filterdemo),
    def filterdemo(request):
        views_str = "Python Vs Java"
        views_date = datetime.datetime.now()
        name = 0
        views_url = "<a href='https://www.baidu.com'>点击跳转</a>"
        return render(request, "filterdemo.html", {"views_str": views_str,
                                                   "views_date": views_date,
                                                   "name": name,
                                                   "views_url": views_url, })
    <p>{{ views_str|lower }}</p>
    <p>{{ views_str|truncatewords:5 }}</p>
    <p>{{ views_str|length }}</p>
    <p>{{ views_date|date:"Y-m-d" }}</p>
    <p>{{ name|default:"如果views传的变量布尔值是false,则使用指定的默认值" }}</p>
    <p>{{ views_str|truncatechars:2 }}</p>
    <p>{{ views_url|safe }}</p>

    模板继承

    模板可以用继承的方式来实现复用,减少冗余内容。

    父模板,标签block...endblock父模板中的预留区域,该区域留个子模版填充差异性内容,不用预留区域名字不能相同。

    {% block名称 %}
    预留给子模块的区域,可以设置默认内容
    {% endblock %}

    子模版,使用标签extends继承父模板

    {% extends "父模板路径" %}

    创建base.html文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>base</title>
    </head>
    <body>
    <h1>主模板</h1>
    <p>Hello World</p>
    
    {% block mainbody %}
    <p>mainbody的block标签是可以被继承者替换的部分</p>
    {% endblock %}
    
    {% block replacebody %}
    <p>replacebody的block标签是可以被继承者替换的部分</p>
    {% endblock %}
    </body>
    </html>
    base.html

    继承父模板内容并自定义

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
    {% extends "base.html" %}
    {% block replacebody %}
    <p>自定义内容</p>
    {% endblock %}
    <p>index</p>
    </body>
    </html>
    View Code

    测试效果

    Django 模型

    Django ORM,Django模型使用自带的ORM,对象关系映射(Object Relational Mapping) 

    Django使用mysql数据库

    创建mysql数据库:

    create database db_testa default charset=utf8;

    创建一个新的项目,Django版本为2.2,遇到报错:NameError: name 'os' is not defined  解决:在settings.py中引入os模块 

    在项目的settings.py文件中找到DATABASES配置项,将其信息修改为:

            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'db_testa',
            'HOST': '127.0.0.1',
            'PORT': 3306,
            'USER': 'root',
            'PASSWORD':'',

    在与settings.py同级4目录下的__init__.py中引入模块进行配置

    import pymysql
    pymysql.install_as_MySQLdb()

    在项目的models.py下面创建测试表

    from django.db import models
    
    
    # Create your models here.
    class Test(models.Model):
        name = models.CharField(max_length=20)

     在命令行中运行命令

    python manage.py migrate
    python manage.py makemigrations
    python manage.py migrate

    数据库操作

    在项目目录下创建testdb.py文件,并修改urls.py

    from django.urls import path
    from app01 import testdb, views
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('testdb/', testdb.testdb),
    ]

    添加数据

    在testdb.py文件中创建对象

    from django.http import HttpResponse
    from app01.models import Test # 引入创建的表
    
    
    # 数据库操作
    def testdb(request):
        dataadd = Test(name='datatest')
        dataadd.save()
        return HttpResponse("数据添加成功!")

    在浏览器访问http://127.0.0.1:8000/testdb/

    获取数据

    修改testdb.py文件

    # 获取数据
    def testdb(request):
        list = Test.objects.all() # 获取所有数据行
        res1 = Test.objects.filter(id=1) # 设置过滤条件
        res2 = Test.objects.get(id=2) # 获取单个对象
        print(list)
        print(res1)
        print(res2)
        # 输出数据
        ret = ""
        for var in list:
            ret += var.name + " "
        return HttpResponse(ret)

    更新数据

    修改数据可以用save()或update()

    # 更新数据
    def testdb(request):
        testlist = Test.objects.get(id=2) #修改其中一个id为2的数据
        testlist.name = 'Python'
        testlist.save()
        # 第二种修改方式
        Test.objects.filter(id=1).update(name='Java')
        return HttpResponse('修改成功')

    在浏览器访问http://127.0.0.1:8000/testdb/

    删除数据 

    删除数据库中的对象只需调用该对象的delete()方法

    # 删除数据
    def testdb(request):
        testlist = Test.objects.get(id=3)
        testlist.delete()
        # 第二种删除方式
        Test.objects.filter(id=1).delete()
        return HttpResponse('删除成功')

    在浏览器访问http://127.0.0.1:8000/testdb/

    Django 表单

    使用默认数据库

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',

    使用Database连接数据库(sqlite数据库连接)

    按路径找到默认数据库

    get方法

    创建一个search.py文件

    from django.shortcuts import render, HttpResponse
    
    # 表单
    def search_form(request):
        return render(request, 'search_form.html')
    
    # 接受请求数据
    def search(request):
        if 'q' in request.GET and request.GET['q']:
            message = '你搜索的内容为:' + request.GET['q']
        else:
            message = '你提交了空表单'
        return HttpResponse(message)

    在templates中增加search_form.html表单

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>search_form</title>
    </head>
    <body>
    <form action="/search/" method="get">
        <input type="text" name="q">
        <input type="submit" value="搜索">
    </form>
    </body>
    </html>

    在urls.py中添加路径

    from django.contrib import admin
    from django.urls import path
    from app01 import testdb, views, search
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('testdb/', testdb.testdb),
        path('search/', search.search),
        path('search_form/', search.search_form),
    ]

    在浏览器输入:http://127.0.0.1:8000/search_form/

    post方法

    search.py添加

    def search_post(request):
        ctx = {}
        if request.POST:
            ctx['rlt'] = request.POST['q']
        return render(request, 'post.html', ctx)

    添加post.html文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>post</title>
    </head>
    <body>
    <form action="/search_post/" method="post">
        {% csrf_token %}
        <p>表格后面还有一个{% csrf_token %}的标签。csrf 全称是 Cross Site Request Forgery。这是Django提供的防止伪装提交请求的功能。POST 方法提交的表格,必须有此标签。</p>
        <input type="text" name="q">
        <input type="submit" value="搜索">
    </form>
        <p>{{ rlt }}</p>
    </body>
    </html>

    urls.py增加路径

        path('search_post/', search.search_post),

    在浏览器输入:http://127.0.0.1:8000/search_post/

    Django 视图

    视图层

    代码写在哪里都可以,只要在 Python 目录下面,一般放在项目的 views.py 文件中。

    每个视图函数都负责返回一个 HttpResponse 对象,对象中包含生成的响应。

    视图层中有两个重要的对象:请求对象(request)与响应对象(HttpResponse)。 

    GET

    数据类型是 QueryDict,一个类似于字典的对象。

    取值格式:对象.方法。

     

      

      

      

      

      

    
    
    

  • 相关阅读:
    05-Selenium的三种等待
    04-selenium 八大元素定位方法
    03-Selenium简单操作
    python-利用json模块处理json数据几个函数总结
    python-利用pymysql获取数据简单使用总结
    python-利用faker模块生成测试数据
    python-利用random模块生成测试数据封装方法总结
    python-利用shutil模块rmtree方法可以将文件及其文件夹下的内容删除
    pytest--配置用例执行顺序(pytest_ordering插件介绍)
    pytest--mark基本使用(主要通过pytest.ini文件注册标签名,对用例进行标记分组)
  • 原文地址:https://www.cnblogs.com/wangzihong/p/14162843.html
Copyright © 2011-2022 走看看