Django框架 | 0基础入门学习

1.1创建第一个 Django 项目

  1.环境准备

1.安装conda

      官网下载安装即可

2.配置Django环境

创建并激活了新的conda环境(环境名称:Djangopro)

创建:conda create -n Djangopro

激活:conda activate Djangopro

下载pip并安装了Python基础环境

conda install pip

 查看下载的所有列表

conda list

1.2视图与URL映射

1.在url中导入视图

选其一:

(1)根路径下:

from goods import views

(2)子路径下:

from . import views

2.导入视图函数路径

urlpatterns = [
    # 2.导入试图路径
    # (1).不带参的视图路径
    path("list",views.goods_list),
]

3.写视图函数(返回文本)

1.不带参的

def goods_list(request):
    return HttpResponse("货物列表")

示图:

 2.带参的:

url映射:

# (2).带参的视图路径
path("detail/<goods_id>",views.goods_detail),

视图函数:

# 2.在url中添加参数(视图中返回文本)
def goods_detail(request,goods_id):
    text="您输入的货物id为:%s"%goods_id
    return HttpResponse(text)

示图:

 4.在url中指定命名空间

# 指定命名空间
app_name='goods'

1.3模版

1.渲染模版(返回视图)

(1).url映射

# (3).返回视图(渲染模版)
path("views",views.goods_views),

(2).创建视图函数

# 在视图中返回视图(渲染模版)
def goods_views(request):
    return render(request,'index.html')

(3).在template中创建html页面(index.html')

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<p>欢迎来到仓库系统</p>
</body>
</html>

示图:

2. 渲染模版,传递变量

(1).url映射

# (4).返回视图(渲染模版,传递变量)
path("value",views.goods_values),

(2).创建视图函数

分别传递了列表、字典、对象,三个不同形式的变量。通过context进行传递。

def goods_values(request):
    # 1.列表
    list = {'username': 'yu',
                'age':'12',
                'sex':'女'}
    # 2.字典
    student=[{"name":"xixi","ID":"01"},
             {"name":"lala","ID":"02"}]

    # 3.对象
    class Person:
        def __init__(self,name):
            self.name=name

    context={
        "list":list,
        "student":student,
        "person":Person("zhuzhu")
    }
    return render(request,'value.html',context=context)
3. .在template中创建html页面(value.html')
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>变量</title>
</head>
<body>
<h1>列表变量</h1>
<p>姓名:{{list.username}}</p>
<p>年龄:{{list.age}}</p>
<p>性别:{{list.sex}}</p>
<h1>数组变量</h1>
<p>所有列表:{{student}}</p>
<p>索引为0:{{student.0}}</p>
<p>索引为0的name值:{{student.0.name}}</p>
<h1>对象变量</h1>
<p>{{person.name}}</p>
</body>
</html>

示图:

3.if判断

(1).url映射

# (5).if判断
path("if",views.goods_if),

(2).视图函数

def goods_if(request):
    return render(request,'if.html',context={"age":19}),

(3) .在template中创建html页面(if.html')

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>if</title>
</head>
<body>
{% if age > 18 %}
    <p>已成年</p>
    {% else %}
    <p>未成年</p>
{% endif %}
</body>
</html>

4.for循环遍历

在 for 循环中, DTL 提供了一些变量可供使用。

这些变量如下:

forloop.counter :当前循环的下标。以 1 作为起始值。

forloop.counter0 :当前循环的下标。以 0 作为起始值。

forloop.revcounter 当前循环的反向下标值。比如列表有 5 个元素,那么第 一次遍历这个属性是等于 5,第二次是 4,以此类推。并且是以 1 作为最后一个 元素的下标。

forloop.revcounter0 :类似于 forloop.revcounter 。不同的是最后一个元素的 下标是从 0 开始。

forloop.first :是否是第一次遍历。

forloop.last :是否是最后一次遍历。

forloop.parentloop :如果有多个循环嵌套,那么这个属性代表的是上一级 的 for 循环。

(1).url映射

# (6).for遍历循环
path("for",views.goods_for)

(2).视图函数

分别遍历列表和字典

def goods_for(request):

#1.遍历列表
    list={
        "username":'yu',
        "age":'18',
        "sex":'女'
    }

#2.遍历字典
    student = {
        "student1":{"name": "xixi", "ID": "01"},
        "student2": {"name": "lala", "ID": "02"}
                }
    context={
        "list":list,
        "student":student
    }
    return render(request,'for.html',context=context)

(3).在template中创建html页面(for.html')

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>for</title>
</head>
<body>
<h1>遍历列表</h1>
{% for i in list %}
    <p>{{ i }}</p>
{% endfor %}
<h1>遍历字典1</h1>
{% for j in student %}
    <p>{{ j }}</p>
{% endfor %}
<h1>遍历字典2</h1>
{% for key,value in student.items %}
    <p>{{ key }}:{{ value }}</p>
{% endfor %}
</body>
</html>

示图:

5.for循环中的变量

forloop.counter

<h1>遍历列表</h1>
{% for i in list %}
    {{ forloop.counter }}
    <p>{{ i }}</p>
{% endfor %}

示图: 

6. with标签

with标签用来为一个复杂的变量名起别名,如果变量的值来自于数据库,在起别名后只需要使用别名即可,无需每次都向数据库发送请求来重新获取变量的值

注意:起别名的变量不能在别的语句中使用!!

方法一:

{% with stu=student %}

<h1>with标签2</h1>

{% with stu=student %}

     <p>{{ stu }}</p>

{% endwith %}

{% with stu=student.student2 %}

     <p>{{ stu }}</p>

{% endwith %}

示图:

方法二:

{% with student as stu %}

<h1>with标签1</h1>
{% with student.student1 as stu %}
    <p>{{ stu }}</p>
{% endwith %}
{% with student.student2.name as stu %}
    <p>{{ stu }}</p>
{% endwith %}

示图:

7.URL标签(<a/>)

使用反转的方式来实现,类似于 django 中的 reverse 一样。

(1).确保url映射中存在name

path("list",views.goods_list,name='list'),

(2).通过url标签进行页面跳转

<h1>url标签</h1>

<a href="{% url "goods:list" %}">首页</a>

(3).url需要传递参数

参数放在路径引号外

关键字参数
<h1>url标签(带参数)</h1>

<a href="{% url 'goods:detail' goods_id=3 %}">货物数</a>
位置参数
<h1>url标签(位置参数)</h1>
<a href="{% url 'goods:detail' 1 %}">货物数</a>
传递两个参数

注意:路径参数顺序和视图函数参数顺序一致

           使用两个占位符,但是传参只用一个%,以%(a,b)的形式传参

url映射:

path("detail/<goods_id>/<goods_weight>",views.goods_detail,name='detail'),

视图函数:

def goods_detail(request,goods_id,goods_weight):
    text="您输入的货物id为:%s,您的货物重量为:%s"

% (goods_id,goods_weight)
    return HttpResponse(text)

Html页面:

<h1>url标签(2个参数)</h1>
<a href="{% url 'goods:detail' 1 2%}">货物详情</a>

示图:

8.模版常用过滤器

(1). add过滤器

将传进来的参数添加到原来的值上面。这个过滤器会尝试将 值 和 参数 转 换成整形然后进行相加。如果转换成整形过程中失败了,那么会将 值 和 参数 进行拼接。如果是字符串,那么会拼接成字符串,如果是列表,那么会拼接成 一个列表。

前后都是字符串

转化整型失败,前后进行字符串拼接

<p>{{person.name|add:"女"}}</p>

前后都是数值

转化整型成功,前后进行相加

<p>{{person.age|add:"1"}}</p>

前后一个是字符串一个数值

转化整型失败,前后进行字符串拼接

<p>{{person.name|add:"1"}}</p>

(2).date过滤器 

 

(3).default过滤器

default 过滤器用于在变量为 False 或空值时提供一个默认值

基本语法:{{ 变量 | default:"默认值" }}

如果变量是以下情况之一,会显示默认值:

None(Python 中的空值)

False(布尔值假)

空字符串 ""

空列表 []、空字典 {}、空元组 ()

其他 Django 模板系统认为“假”的值。

例子:

{% if age|default:0 > 18  %}
    <p>已成年</p>
    {% else %}
    <p>未成年</p>
{% endif %}

如果当age为空值时,便会返回0

默认值为变量
<!-- 默认值可以是另一个变量 -->

{{ user.bio | default:user.username }}

1.4.模版结构

1.include模版

include 是 Django 模板系统中非常实用的标签,它允许你将一个模板嵌入到另一个模板中,实现模板的模块化和复用。

基本语法:{% include "模板路径" %}

在其他模版中引入

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<p>欢迎来到仓库系统</p>
    {% include 'value.html'%}
</body>
</html>

示图:

include向子模版传递变量

#父模版

{% include 'value.html' with person_name="singing" saying="hello everyone" %}

#子模版

<p>名字:{{ person_name }}</p>
<p>问候:{{ saying }}</p>

示图:

2.继承模版

在模板继承中最常用了标签就是 {% block %} 与 {% extends %} 标签,其中 {% block% } 标签与 {% endblock %} 标签成对出现,而 {% extends %} 放在子模板的第一行且必须是模板中的第一个标签,标志着此模板继承自父模板。

extends 标签必须放在模版的第一行。子模板中的代码必须放 在 block 中,否则将不会被渲染。

 #定义父模板可被重写内容

{% block block_name %}

...可以被子模板覆盖的内容

{% endblock block_name %}

#继承父模板

{% extends '父模板名称' %}

#子模板重写父模板

{% block block_name %}

...子模板覆盖后呈现的新内容

{% endblock block_name %} 

重写父模版

<header>{% block header %}网站头部{% endblock %}</header>

子模版:

{% block header %}首页 - 我的网站{% endblock %}

继承父模版

{% block title %}{% endblock %}

总结

1.block 标签需要成对出现,使用 {{ endblock }} 作为结束标签;

2.定义 block 标签名字,子模板中具有同样名称的 block 块完成对父模板的替换;

3.子模板不需要定义父模板中的所有 block,未定义时,子模板将原样使用父模板中的内容;

4.子模板需要使用 {% extends %} 标签继承父模板,且必须是模板中的第一个标签,并放在文件的第一行;

1.5加载静态文件

1. 基本配置

第一步:确保 INSTALLED_APPS 包含 django.contrib.staticfiles

# settings.py

INSTALLED_APPS = [

    ...

    'django.contrib.staticfiles',

    ...

]

第二步:配置静态文件相关设置

# settings.py

STATIC_URL = '/static/'  # 静态文件的URL前缀



# 开发环境下静态文件目录

STATICFILES_DIRS = [

    os.path.join(BASE_DIR, 'static'),

]



# 生产环境收集静态文件的目录

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

2. 开发环境使用静态文件

第一步:创建静态文件目录

第二步: 在模板中加载静态文件

首先在模板顶部加载 static 标签:

{% load static %}

然后使用以下方式引用静态文件:

<!-- 加载CSS文件 -->

<link rel="stylesheet" href="{% static 'css/style.css' %}">



<!-- 加载JavaScript文件 -->

<script src="{% static 'js/app.js' %}"></script>



<!-- 加载图片 -->

<img src="{% static 'images/logo.png' %}" alt="Logo">

1.6操作mysql数据库

1. Django 配置连接数据库

第一步:在 settings.p y 文件中配置数据库

DATABASES = {
    "default": {

        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'students',          # 数据库名
        'USER': 'root',             # 数据库用户名
        'PASSWORD': '041213',       # 数据库密码
        'HOST': 'localhost',        # 数据库服务器地址
        'PORT': '3306',
    }
}

第二步:安装 mysqlclient

切换到项目解释器路径下:

pip install mysqlclient

报错:

AttributeError: module 'MySQLdb' has no attribute '__version__'

强制重新安装 mysqlclient

pip uninstall mysqlclient -y

pip install --no-cache-dir mysqlclient

安装成功后验证安装完整性

# 检查安装路径

python -c "import MySQLdb; print(MySQLdb.__file__)"

# 正常应输出类似:D:\Anaconda\Lib\site-packages\MySQLdb\__init__.py



# 检查依赖项

pip check mysqlclient

切换到项目根路径:

测试基础功能

python -c "import MySQLdb; print(MySQLdb.connect('localhost', 'root', '041213', 'students'))"

如果连接成功,说明功能正常

执行迁移(确保 settings.py 中的数据库配置与测试一致)

python manage.py migrate

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值