Pycharm社区版下载操作Django二

接上回

四、Django 模板标签

4.过滤器
safe标签
这里介绍一个safe
将字符串标记为安全,不需要转义。
要保证 views.py 传过来的数据绝对安全,才能用 safe。

Django 会自动对 views.py 传到HTML文件中的标签语法进行转义,令其语义失效。加 safe 过滤器是告诉 Django 该数据是安全的,不必对其进行转义,可以让该数据语义生效。
vs.py代码如下(从views.py改名):

from django.shortcuts import render

def runoob(request):
    views_str = "<a href='https://www.runoob.com/'>点击跳转</a>"
    return render(request, "runoob.html", {"views_str": views_str})

runoob.html:

runoob文件作为模板文件的设置方式是settings中的TEMPLATES的DIRS修改为'DIRS': [os.path.join(BASE_DIR, 'templates')],

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这里是标题</title>
</head>
<body>
这里是正文
<!--<h1>{{ hello }}</h1>-->
{{ views_str|safe }}
</body>
</html>

urls.py依旧不变:

from django.urls import path
from . import vs
urlpatterns = [
    path('runoob/', vs.runoob),
]

运行结果如下:

1


runoob.html文件中不加safe过滤的结果运行如下:

2


if/else 标签
基本语法格式如下:

{% if condition %}
     ... display
{% endif %}

或者:

{% if condition1 %}
   ... display 1
{% elif condition2 %}
   ... display 2
{% else %}
   ... display 3
{% endif %}

根据条件判断是否输出。if/else 支持嵌套。

{% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not )
urls.py不变。
vs.py:

from django.shortcuts import render


def runoob(request):
#尝试hello world
#    context = {}
#    context['hello'] = 'Hello World!'
#    return render(request, 'runoob.html', context)

#尝试safe标签
#    views_str = "<a href='https://www.runoob.com/'>点击跳转</a>"
#    return render(request, "runoob.html", {"views_str": views_str})

#尝试if/else标签
    views_num = 88
    return render(request, "runoob.html", {"num": views_num})

runoob.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这里是标题</title>
</head>
<body>
这里是正文
<!--尝试hello world-->
<!--<h1>{{ hello }}</h1>-->

<!--尝试safe标签-->
<!--{{ views_str|safe}}-->

<!--尝试if/else标签-->
{%if num > 90 and num <= 100 %}
优秀
{% elif num > 60 and num <= 90 %}
合格
{% else %}
一边玩去~
{% endif %}
</body>
</html>

运行结果:

1


for标签

{% for %} 允许我们在一个序列上迭代。

与 Python 的 for 语句的情形类似,循环语法是 for X in Y ,Y 是要迭代的序列而 X 是在每一个特定的循环中使用的变量名称。

每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。

例如,给定一个运动员列表 athlete_list 变量,我们可以使用下面的代码来显示这个列表:

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

runoob.html:

<body>
这里是正文
<!--尝试hello world-->
<!--<h1>{{ hello }}</h1>-->

<!--尝试safe标签-->
<!--{{ views_str|safe}}-->

<!--尝试if/else标签-->
<!--{%if num > 90 and num <= 100 %}-->
<!--优秀-->
<!--{% elif num > 60 and num <= 90 %}-->
<!--合格-->
<!--{% else %}-->
<!--一边玩去~-->
<!--{% endif %}-->

<!--for标签-->
{% for i in views_list %}
{{ i }}
{% endfor %}
</body>

vs.py:

def runoob(request):
#尝试hello world
#    context = {}
#    context['hello'] = 'Hello World!'
#    return render(request, 'runoob.html', context)

#尝试safe标签
#    views_str = "<a href='https://www.runoob.com/'>点击跳转</a>"
#    return render(request, "runoob.html", {"views_str": views_str})

#尝试if/else标签
#    views_num = 88
#    return render(request, "runoob.html", {"num": views_num})

#for标签
    views_list = ["菜鸟教程","菜鸟教程1","菜鸟教程2","菜鸟教程3",]
    return render(request, "runoob.html", {"views_list": views_list})

运行结果:

1


给标签增加一个 reversed 使得该列表被反向迭代:
runoob.html:

{% for i in views_list  reversed%}
{{ i }}
{% endfor %}

结果:

2


遍历字典:
可以直接用字典 .items 方法,用变量的解包分别获取键和值。
vs.py:

#遍历字典
    views_dict = {"name": "菜鸟教程", "age": 18}
    return render(request, "runoob.html", {"views_dict": views_dict})

runoob.html:

<!--遍历字典-->
{% for i,j in views_dict.items %}
{{ i }}---{{ j }}
{% endfor %}

结果:

3


{% empty %}

可选的 {% empty %} 从句:在循环为空的时候执行(即 in 后面的参数布尔值为 False )。
runoob.html:

{% for i in listvar %}
    {{ forloop.counter0 }}
{% empty %}
    空空如也~
{% endfor %}

vs.py

#empty
    views_list = []
    return render(request, "runoob.html", {"listvar": views_list})

结果:

4


注释标签
Django 注释使用 {# #}。

{# 这是一个注释 #}

include 标签
{% include %} 标签允许在模板中包含其它的模板的内容。
下面这个例子都包含了 nav.html 模板:

{% include "nav.html" %}

后续的自定义标签和过滤器没研究

五、Django模型

1.数据库配置
Django 如何使用 mysql 数据库
先在Pycharm中下载mysql

1

Django 模型使用自带的 ORM。 对象关系映射(Object Relational Mapping,简称 ORM
)用于实现面向对象编程语言里不同类型系统的数据之间的转换。

电脑本地下载MySQL,创建一个名为runoob的数据库。
创建 MySQL 数据库( ORM 无法操作到数据库级别,只能操作到数据表)语法:

create database 数据库名称 default charset=utf8; # 防止编码问题,指定为 utf8

1

修改settings.py中的DATABASE
修改前:

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

修改后:

DATABASES = { 
    'default': 
    { 
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'runoob', # 数据库名称
        'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1 
        'PORT': 3306, # 端口 
        'USER': 'root',  # 数据库用户名
        'PASSWORD': '123456', # 数据库密码
    }  
}

告诉 Django 使用 pymysql 模块连接 mysql 数据库:

# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
import pymysql
pymysql.install_as_MySQLdb()

2.定义模型

我们之前已经在终端中使用django-admin startapp app01命令新建了一个应用app01,现在的目录结构如下:

1


我们修改 app01/models.py 文件,代码如下:

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

以上的类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。

接下来在myapp/settings.py 中找到INSTALLED_APPS这一项,如下:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',        #添加此项
]

在Pycharm中终端中进入myapp目录下依次执行以下命令:

manage.py migrate   # 创建表结构

manage.py makemigrations TestModel  # 让 Django 知道我们在我们的模型有一些变更
manage.py migrate TestModel   # 创建表结构

1


2


我们的文档结构变成了这样:

1


3.数据库操作

myapp/myapp目录中添加 testdb.py 文件(下面介绍),并修改 urls.py:

from django.urls import path
from . import vs
from . import testdb
urlpatterns = [
    path('runoob/', vs.runoob),
    path('testdb/',testdb.testdb)
]

后续的添加数据、修改数据、更新数据等数据库操作均只需改变testdb.py文件即可,urls.py文件不变。
添加数据
添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:
myapp/myapp/testdb.py: 文件代码:

from django.http import HttpResponse
from app01.models import Test
# 数据库操作
def testdb(request):
    test1 = Test(name='runoob')
    test1.save()
    return HttpResponse("<p>数据添加成功!</p>")

访问http://127.0.0.1:8000/testdb/

1


获取数据
myapp/myapp/testdb.py: 文件代码:

# 数据库操作,获取数据
def testdb(request):
    # 初始化
    response = ""
    response1 = ""

    # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
    list = Test.objects.all()

    # filter相当于SQL中的WHERE,可设置条件过滤结果
    response2 = Test.objects.filter(id=1)

    # 获取单个对象
    response3 = Test.objects.get(id=1)

    # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
    Test.objects.order_by('name')[0:2]

    # 数据排序
    Test.objects.order_by("id")

    # 上面的方法可以连锁使用
    Test.objects.filter(name="runoob").order_by("id")

    # 输出所有数据
    for var in list:
        response1 += var.name + " "
    response = response1
    return HttpResponse("<p>" + response + "</p>")

运行结果:

在这里插入图片描述


更新数据
myapp/myapp/testdb.py: 文件代码:

# 数据库操作,更新数据
def testdb(request):
    # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
    test1 = Test.objects.get(id=1)
    test1.name = 'Google'
    test1.save()

    # 另外一种方式
    # Test.objects.filter(id=1).update(name='Google')

    # 修改所有的列
    # Test.objects.all().update(name='Google')

    return HttpResponse("<p>修改成功</p>")

运行结果:

在这里插入图片描述


当我下载navicat之后显示如下:

1


删除数据
myapp/myapp/testdb.py: 文件代码:

# 数据库操作,删除数据
def testdb(request):
    # 删除id=1的数据
    test1 = Test.objects.get(id=1)
    test1.delete()

    # 另外一种方式
    # Test.objects.filter(id=1).delete()

    # 删除所有数据
    # Test.objects.all().delete()

    return HttpResponse("<p>删除成功</p>")

运行结果:

在这里插入图片描述


navicat显示:

在这里插入图片描述


汇总:
此刻目录结构:

1


myapp.myapp.init.py

# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
import pymysql
pymysql.install_as_MySQLdb()

myapp.myapp.urls.py

'''
from django.urls import re_path as url
from . import vs
urlpatterns = [
    url(r'^$', vs.hello),
]
'''

#数据库操作修改前
# from django.urls import path
# from . import vs
# urlpatterns = [
#     path('runoob/', vs.runoob),
# ]

#数据库操作修改后
from django.urls import path
from . import vs
from . import testdb
urlpatterns = [
    path('runoob/', vs.runoob),
    path('testdb/',testdb.testdb)
]

myapp.myapp.vs.py

from django.shortcuts import render


def runoob(request):
#尝试hello world
#    context = {}
#    context['hello'] = 'Hello World!'
#    return render(request, 'runoob.html', context)

#尝试safe标签
#    views_str = "<a href='https://www.runoob.com/'>点击跳转</a>"
#    return render(request, "runoob.html", {"views_str": views_str})

#尝试if/else标签
#    views_num = 88
#    return render(request, "runoob.html", {"num": views_num})

#for标签
    # views_list = ["菜鸟教程","菜鸟教程1","菜鸟教程2","菜鸟教程3",]
    # return render(request, "runoob.html", {"views_list": views_list})

#遍历字典
    # views_dict = {"name": "菜鸟教程", "age": 18}
    # return render(request, "runoob.html", {"views_dict": views_dict})

#empty
    views_list = []
    return render(request, "runoob.html", {"listvar": views_list})

myapp.myapp.testdb.py

# -*- coding: utf-8 -*-
#
# from django.http import HttpResponse
#
# from myapp.app01.models import Test
#
#
# # 数据库操作
# def testdb(request):
#     # 初始化
#     response = ""
#     response1 = ""
#
#     # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
#     list = Test.objects.all()
#
#     # filter相当于SQL中的WHERE,可设置条件过滤结果
#     response2 = Test.objects.filter(id=1)
#
#     # 获取单个对象
#     response3 = Test.objects.get(id=1)
#
#     # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
#     Test.objects.order_by('name')[0:2]
#
#     # 数据排序
#     Test.objects.order_by("id")
#
#     # 上面的方法可以连锁使用
#     Test.objects.filter(name="runoob").order_by("id")
#
#     # 输出所有数据
#     for var in list:
#         response1 += var.name + " "
#     response = response1
#     return HttpResponse("<p>" + response + "</p>")

# -*- coding: utf-8 -*-

from django.http import HttpResponse
# from myapp.app01.models import Test


# 数据库操作
# from app01.models import Test
from app01.models import Test

#添加数据
# def testdb(request):
#     test1 = Test(name='runoob')
#     test1.save()
#     return HttpResponse("<p>数据添加成功!</p>")

#  数据库操作,获取数据
# def testdb(request):
#     # 初始化
#     response = ""
#     response1 = ""
#
#     # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
#     list = Test.objects.all()
#
#     # filter相当于SQL中的WHERE,可设置条件过滤结果
#     response2 = Test.objects.filter(id=1)
#
#     # 获取单个对象
#     response3 = Test.objects.get(id=1)
#
#     # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
#     Test.objects.order_by('name')[0:2]
#
#     # 数据排序
#     Test.objects.order_by("id")
#
#     # 上面的方法可以连锁使用
#     Test.objects.filter(name="runoob").order_by("id")
#
#     # 输出所有数据
#     for var in list:
#         response1 += var.name + " "
#     response = response1
#     return HttpResponse("<p>" + response + "</p>")

# 数据库操作,更新数据
# def testdb(request):
#     # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
#     test1 = Test.objects.get(id=1)
#     test1.name = 'Google'
#     test1.save()
#
#     # 另外一种方式
#     # Test.objects.filter(id=1).update(name='Google')
#
#     # 修改所有的列
#     # Test.objects.all().update(name='Google')
#
#     return HttpResponse("<p>修改成功</p>")


# 数据库操作,删除数据
def testdb(request):
    # 删除id=1的数据
    test1 = Test.objects.get(id=1)
    test1.delete()

    # 另外一种方式
    # Test.objects.filter(id=1).delete()

    # 删除所有数据
    # Test.objects.all().delete()

    return HttpResponse("<p>删除成功</p>")

myapp.myapp.settings.py


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',        #添加此项
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'myapp.urls'

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',
            ],
            # "libraries":{                          # 添加这边三行配置
            #     'my_tags':'templatetags.my_tags'   # 添加这边三行配置
            # }                                      # 添加这边三行配置
        },
    },
]

WSGI_APPLICATION = 'myapp.wsgi.application'

#数据库修改前
# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases

# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': BASE_DIR / 'db.sqlite3',
#     }
# }
#数据库修改后
DATABASES = {
    'default':
    {
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'runoob', # 数据库名称
        'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
        'PORT': 3306, # 端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': '123456', # 数据库密码
    }
}

myapp.app01.models.py

from django.db import models

# Create your models here.
# models.py
from django.db import models


class Test(models.Model):
    name = models.CharField(max_length=20)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340