Django(学习笔记-1)

Django

环境

1.Python 3.7
2.Django 2.2.4
3.工具:Pycharm

一、安装Django

1.[官网](https://www.djangoproject.com/download/)下载压缩包
2.解压文件到相关目录,解压后可以看到有一个setup.py文件(django的安装文件)
3.进入解压目录,打开cmd面板,输入 python setup.py install 命令并运行,开始安装...
运行完成后,显示安装目录地址
4.查看是否安装成功,运行命令:python -m django --version

二、创建一个项目

1.在准备存放项目的目录下运行命令:django-admin startproject [项目名称](例:django-admin startproject myblog);
2.项目结构:
    # myblog
        # myblog            项目容器(创建后不建议修改)
            # __init__.py
            # settings.py   项目的总配置文件
            # urls.py       URL配置文件
            # wsgi.py       中文名:Python服务器网关接口;Python应用与文本服务器之间的接口
        # manage.py         与项目进行交互的命令行工具集的入口
3.打印命令:python manage.py
4.启动项目:python manage.py runserver
5.切换项目服务端口号:python manage.py runserver 9999(可不执行,默认使用8000端口)

三、创建一个应用

1.打开命令行,进入项目中 manage.py 的同级目录
2.命令:python manage.py startapp [应用名称] (例:python manage.py startapp blog)
3.将blog 应用添加至 settings.py 文件中的 INSTALLED_APPS[] 集合中
4.应用目录结构:
    # migrations      数据移植(迁移)的模块
        # __init__.py
    # __init__.py
    # admin.py        该应用的后台管理系统配置文件
    # apps.py         该应用的一些配置
    # models.py       数据模块,使用ORM框架
    # tests.py        自动化测试模块
    # views.py        执行响应的代码所在模块,主要处理代码逻辑

四、创建第一个视图

1.在之前使用命令 python manage.py startapp 创建的应用 blog 下有一个views.py 文件,方法需要写入此文件中(等同于PHP的控制器文件)
2.首先导入 django.http 模块的 HttpResponse 类
3.定义一个函数,每个函数只要要有一个参数(通常被叫做request)
例:
    from django.http import HttpResponse

    def index(request):
        return HttpResponse("Hello World!!!");
4.配置url(第一种):
    创建项目时,根目录下自动生成了一个 urls.py 文件(url配置文件),文件中首先要引入视图方法,然后配置url所指向的方法
    例:
        # 引入业务逻辑层方法
        import blog.views as bn

        urlpatterns = [
            path('admin/', admin.site.urls),
            path('index/', bn.index),
        ]
    配置url(第二种):
        ①在根目录下的urls.py文件中引入include
        ②在应用目录下创建urls.py文件,格式与根目录下urls.py文件相同
        ③根目录下的urls.py中配置url指向应用下的urls.py文件
        例: 根目录下的urls.py文件:
            from django.urls import path,include

            urlpatterns = [
                path('admin/', admin.site.urls),
                path('blog/', include('blog.urls')),
            ]

            应用目录下的urls.py文件:
            from django.urls import path

            # 引入业务逻辑层方法
            from .views import index
            urlpatterns = [
                path('index/', index),
            ]
    注意:根目下的urls.py文件针对应用配置的url名称,是该应用所有url的总路径
5.重启应用并在浏览器访问 http://127.0.0.1:8000/index/ 或者 http://127.0.0.1:8000/blog/index/

五、Templates(模板)

1.首先在应用目录下创建一个 templates 目录,然后在templates下再创建一个子目录(例:templates/blog)
    注意:创建子目录是为了防止在有多个应用且模板文件相同时出现不必要的bug
2.在子目录下创建一个 html 文件(例:index.html)
3.在 views.py 中返回 render(),用于渲染页面,参数1:请求的对象request;参数2:模板文件index.html;参数3:要传给前端页面的数据,支持dict类型,键为参数名;
例:
    from django.shortcuts import render

    def index(request):
        res = {'hello':"Hello Blog!"};
        return render(request,'blog/index.html',res);
4.在html页面中展示数据用 {{ }} 号,例:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Django</title>
    </head>
    <body>
    <b>{{ hello }}</b>
    </body>
    </html>

六、Models

1.Django中的Models是什么:
    通常,一个Model对应数据库的一张数据表,Django中Models以类的形式表现,它包含了一些基本字段一级数据的一些行为.
2.创建model类:在应用下的models.py文件中创建一个类,并继承models.Model类,例:
        from django.db import models

        #创建一个文章表
        class Article(models.Model):
            pass
    注意:一个类对应一个数据表
3.创建字段:字段即是类中的属性(变量),例:
    from django.db import models

    #创建一个文章表
    class Article(models.Model):
        #文章标题
        title = models.CharField(max_length=64, default='标题');
        #文章内容
        content = models.TextField(null=True);

    注意:类的各种字段以及字段可选参数可在Django官方文档中查看
4.生成数据表:
    ①执行命令 python manage.py makemigrations [应用名称](可选)
    ②继续执行命令 python manage.py migrate
    ③此时Django会自动在应用下面的migrations目录下生成一个移植文件,同时在项目根目录下会生成一个db.sqlite3数据库
5.获取(查询)数据:
    ①首先在views.py文件中导入models模块
    ②执行 models.[model类名称].objects.get(),例:
        from django.shortcuts import render
        # 导入models模块
        from . import models

        def index(request):
            # 获取ID为1的数据
            article = models.Article.objects.get(pk=1);
            res = {'result':article}
            # 加载模板并渲染数据
            return render(request,'blog/index.html',res);

    # 页面展示
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Django</title>
        </head>
        <body>
        <h1>{{ result.title }}</h1>
        <h3>{{ result.content }}</h3>
        </body>
        </html>

七、Admin

1.Admin是Django自带的后台管理系统,被授权的用户可直接在Admin中管理数据库以及很多的定制功能
2.配置Admin:
    因为安装项目时已自动安装配置了后台应用,所以在此不需要我们再自己配置,只需创建一个超级用户
3.创建用户:
    命令 python manage.py createsuperuser 接下来根据命令提示继续操作,直至创建成功
4.后台地址:
    服务地址 + admin/ (例:http://127.0.0.1:8000/admin/)
5.配置多语言:
    修改settings.py文件中LANGUAGE_CODE = 'zh-hans'
6.注册models:
    ①后台默认不显示前面添加的应用下models模块,须注册后才可以显示并进行操作
    ②打开应用下admin.py文件,引入自身的models模块(或者里面的模型类),并添加 admin.site.register([模型类名称]) 
    例: 
        #引入要注册的模型类
        from .models import Article
        #注册模型类
        admin.site.register(Article)
7.修改后台模型类资源列表中默认显示数据:
    在模型类中添加 __str__(self)[Python3] 或 __unicode__(self)[Python2] 方法
    例:
        #创建一个文章表
        class Article(models.Model):
            #文章标题
            title = models.CharField(max_length=64, default='标题');
            #文章内容
            content = models.TextField(null=True);
            #创建时间
            create_time = models.DateTimeField(null=True);

            def __str__(self):
                # 使后台默认显示文章标题
                return self.title

修改前:
image.png
修改后:
image.png

8.修改后台模型类资源列表,使其显示多个字段(默认只显示一个字段)
    ①.首先创建一个配置类: 
        class [配置类名称](admin.ModelAdmin):
            # 使用list_display属性设置要展示字段
            list_display = ('title','content');
            # 使用list_filter属性添加过滤器
            list_filter = ('create_time',);
    ②.在原注册语句的基础上添加配置类参数:admin.site.register(Article,[配置类名称])
    注意:属性同时支持tuple和list两种类型,使用tuple类型且只有一个元素时,元素后面一定要加','号
    示例结果:

image.png

更多DjangoAdmin功能,请查看官方文档:https://docs.djangoproject.com/zh-hans/2.1...

八、模板标签

1.变量输出
    逻辑层按如下方式赋值
        return render(request,'blog/index.html',{'result':'Hello World!!!'});
    在模板中
        <div>{{ result }}</div>
2.循环标签
    逻辑层对模板赋值
        from . import models
        def index(request):
            # 获取article表中所有的数据,使用all()方法,返回结果为集合对象
            articles = models.Article.objects.all();
            res = {'articles':articles}
            # 加载模板并渲染数据
            return render(request,'blog/index.html',res);
    在模板中循环输出
        <body>
        {% for article in articles %}
        <h1>{{ article.title }}</h1>
        <h3>{{ article.content }}</h3>
        {% endfor %}
        </body>
3.条件判断标签
    {% if [变量] %}

    {% else %}

    {% endif %}

九、路由配置系统URLconf

1.每一个URL都会对应一个视图函数,当一个用户请求访问Django站点的一个页面时,然后就由Django路由系统(URL配置文件)去决定要执行哪个视图函数使用的算法。这个路由系统我们也称之为url控制器,一般是项目目录和应用目录里的urls.py文件
2.url书写规则
    urlpatterns = [
        path(正则表达式, views视图函数,参数,别名),
    ]
    参数说明:
    ①一个正则表达式字符串
    ②一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
    ③可选的要传递给视图函数的默认参数(字典形式)
    ④一个可选的name参数(别名)
    例:
        from django.urls import path
        from . import views
        urlpatterns = [
            path('articles/2003/', views.special_case_2003),
            path('articles/<int:year>/', views.year_archive),
            path('articles/<int:year>/<int:month>/', views.month_archive),
            path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
        ]
    注意:
    要捕获一段url中的值,需要使用尖括号,而不是之前的圆括号(之前版本使用()号);
    可以转换捕获到的值为指定类型,比如例子中的<int:name>。默认情况下,捕获到的结果保存为字符串类型,不包含/这个特殊字符;
    规则的前面不需要添加/,因为默认情况下,每个url都带一个最前面的/。比如:articles, 不能写成 /articles。

(一)、path转换器

    Django默认情况下内置下面的路径转换器:
    1、str:匹配任何非空字符串,但不含斜杠/,如果你没有专门指定转换器,那么这个是默认使用的;
    2、int:匹配0和正整数,返回一个int类型
    3、slug:可理解为注释、后缀、附属等概念,是url拖在最后的一部分解释性字符。该转换器匹配任何ASCII字符以及连接符和下划线,比如’ building-your-1st-django-site‘;
    4、uuid:匹配一个uuid格式的对象。为了防止冲突,规定必须使用破折号,所有字母必须小写,例如’075194d3-6885-417e-a8a8-6c931e272f00‘ 。返回一个UUID对象;
    5、path:匹配任何非空字符串,重点是可以包含路径分隔符’/‘。这个转换器可以帮助你匹配整个url而不是一段一段的url字符串。

(二)、注册自定义路径转换器

    对于更复杂的匹配需求,可以定义自己的路径转换器。自定义,就是单独写一个类,它包含下面的内容:
    1、类属性regex:一个字符串形式的正则表达式属性;
    2、to_python(self, value) 方法:一个用来将匹配到的字符串转换为你想要的那个数据类型,并传递给视图函数。如果不能转换给定的值,则会引发ValueError。
    3、to_url(self, value)方法:将Python数据类型转换为一段url的方法,上面方法的反向操作。
    例如:
        class FourDigitYearConverter:
            regex = '[0-9]{4}'
            def to_python(self, value):
                return int(value)
            def to_url(self, value):
                return '%04d' % value
    在URLconf中注册自定义转换器类,并使用它:
        from django.urls import path, register_converter
        from . import converters, 
        viewsregister_converter(converters.FourDigitYearConverter, 'yyyy')
        urlpatterns = [
                path('articles/2003/', views.special_case_2003),
                path('articles/<yyyy:year>/', views.year_archive),
                ...
            ]

(三)、使用正则表达式

    如果路径和转换器语法不足以定义URL模式,也可以使用正则表达式。这时我们就需要使用re_path()而不是path()。
    在Python正则表达式中,命名正则表达式组的语法是 (?P<name>pattern),其中name是组的名称,pattern是需要匹配的规则。

    前面的URLconf示例,如果使用正则表达式重写,是这样子的:

    from django.urls import path, re_path
    from . import views
    urlpatterns = [
            path('articles/2003/', views.special_case_2003),
            #表示articles/2003/这个路径映射views模块的special_case_2003函数
            re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
            #表示匹配4个0-9的任意数字
            re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
            re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
        ]
    #注意:上面匹配都加了小括号,这些括号里面的值会当作参数传递到后面的视图函数中
    re_path与path()不同的主要在于两点:
        1、year中匹配不到10000等非四位数字,这是正则表达式决定的
        2、传递给视图的所有参数都是字符串类型。而不像path()方法中可以指定转换成某种类型。

(四)、模板中生成URL

    1.在HTML页面中生成url地址可以用 "{% url 'url_name' param %}"
    2.其中 url 为关键字;url_name 可在应用下的urls.py文件中配置 name = '别名'(配置路由别名);param 为要传递的参数
    例: 配置url_name(urls.py)

        from django.urls import path

        # 引入业务逻辑层方法
        from . import views

        urlpatterns = [
            path('index/', views.index),
            path('article/<article_id>/', views.Article_page, name='Article_page'),
        ]
        -------------------------------------------------------------------------------
        HTML页面中书写方式(index.html):
        <body>
        {% for article in articles %}
        <h1><a href="{% url 'Article_page' article.id %}">{{ article.title }}</a></h1>
        {% endfor %}
        </body>

十、Form表单

注意:配置表单url方法同上

(一)、添加数据

    HTML页面:例
        <body>
        <form action="{% url 'add_article' %}" method="post">
            {% csrf_token %}
            <input type="text" name="title" value="" placeholder="请填写标题">
            <input type="text" name="content" value="" placeholder="请输入文章内容">
            <input type="submit" value="提交">
        </form>
        </body>
----------------------------------------------------------------------------------------
    接收Form表单提交内容(views.py):
        # 提交新的文章
        def add_article(request):
            # 获取写入内容
            title = request.POST['title'];
            content = request.POST['content'];
            # 写入文章
            models.Article.objects.create(title=title,content=content);
            # 查询所有文章
            articles = models.Article.objects.all();
            res = {'articles': articles}
            return render(request,'blog/index.html',res);

(二)、修改数据

    HTML页面内容基本同上,重点是在控制器中修改原数据时的方式,使用修改对象属性的方式修改数据表中数据,例:
        # 获取要修改的内容
        title = request.POST['title'];
        content = request.POST['content'];
        id = request.POST['id'];
        # 获取要修改的原文章
        result = models.Article.objects.get(pk=id);
        # 修改文章
        result.title = title;
        result.content = content;
        # 保存修改后的文章
        result.save();

十一、Templates过滤器

1.过滤器:写在模板中的,属于Django模板语言,可以修改模板中的变量,从而显示不同的内容
2.使用过滤器: {{ value | filter }}
    例:<input type="hidden" name="id" value="{{ article.id | default:'0' }}">,default便是过滤器
注意:过滤器可叠加,如:{{ value | filter1 | filter2 | filter3 | filter4 }}

更多内置过滤器参考:https://docs.djangoproject.com/zh-hans/2.1/ref/templates/builtins/#ref-templates-builtins-filters

有感:学习至此先告一段落。这些只是接触Django的一个开始,需要学习的还有很多,目前只是学习了Django的九牛一毫,由此深感Django之强大。(革命尚未成功 同志仍需努力)

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!