Django基础

Django基础
学习目标
认识Django,了解Django与Python版本的关系
熟练搭建与使用虚拟环境
熟悉Django项目的结构
了解Django项目与应用的区别
掌握在项目中创建与注册应用
熟悉Django架构,掌握MTV各部分的功能
一、Django框架介绍

  1. 何为框架
    度娘上说:框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间
    交互的方法;
    另一种定义认为,框架是可被应用开发者定制的应用骨架 ,是某种应用的半成品
    使用框架开发项目的好处
    开发周期短
    维护成本低
    软件生产效率和质量也得到了提高
  2. 认识Django框架
    Django,发音为[`dʒæŋɡəʊ], Django是劳伦斯出版集团的开发人员为开发新闻内容网站而设计出来
    的一个软件,它遵循MVC思想,但是有自己的一个名词,叫做MVT
    Django是使用Python语言编写的一个开源Web应用框架,鼓励快速开发,是当前最为流行的python
    Web开发框架
    Django框架优点:
  3. Django的特点
    1)重量级框架
    对比python其他web框架,比如flask,Tornado 而言,Django原生提供了众多的功能组件,让开发更
    简便快速。
    提供项目工程管理的自动化脚本工具
    数据库ORM支持(对象关系映射,英语:Object Relational Mapping)
    模板
    表单
    Admin管理站点
    文件管理
    认证权限
    session机制
    缓存
    2)MVT模式
    有一种程序设计模式叫MVC,其核心思想是分工、解耦,让不同的代码块之间降低耦合,增强代码的可
    扩展性和可移植性。
    MVC的全拼为Model-View-Controller,为了将传统的输入(input)、处理(processing)、
    输出(output)任务运用到图形化用户交互模型中而设计的。随着标准输入输出设备的出现,开
    发人员只需要将精力集中在业务逻辑的分析与实现上。后来被推荐为Oracle旗下Sun公司Java EE
    平台的设计模式,并且受到越来越多开发者欢迎。现在虽然不再使用原来的分工方式,但是这种
    分工的思想被沿用下来,广泛应用于软件工程中,是一种典型并且应用广泛的软件架构模式。后
    来,MVC的思想被应用在了Web开发方面,被称为Web MVC框架。
    MVC模式说明
    M全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作。
    V全拼为View,用于封装结果,生成页面展示的html内容。
    C全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。
    3)Django的MVT
    Django的MVT
    M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
    V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
    T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。
    项目启动后,用户通过浏览器向Web服务器发起请求,Web服务器将请求传递到要处理该请求的
    Django项目,Django接收用户通过浏览器发起的请求,urls.py文件根据URL地址分发路由,将请求交
    给views.py中相应的视图;视图处理请求(此时涉及数据存取),并将处理结果与模板结合生成响应数
    据返回给Web服务器,服务器将数据返回到浏览器,最终呈现给用户。具体如下图所示
  4. Django学习资料
    官方网站
    Github源码
    1.11版中文文档
    二、安装Django
    2.1 创建虚拟的Python环境
    实际生产中同一项目的不同版本可能依赖不同的环境,这时需要在系统中安装多个版本的
    Python,若直接在物理环境中进行配置,多个版本的软件之间会产生干扰。为了避免这种情况,
    应使用virtualenv命令创建虚拟环境,以隔离不同版本的Python
    windows中安装虚拟Python环境
    1.打开控制台窗口,使用pip工具可以在线安装virtualenv,具体命令如下:
    pip install virtualenv
    2.virtualenv安装完成后,使用命令创建虚拟环境,具体如下所示:
    virtualenv first_env
    提示: 若要创建包含指定Python版本的虚拟环境,需使用-p选项指定该版本Python可执行文件所在的
    路径,完整命令格式如下:
    virtualenv –p python.exe 路径 虚拟环境名
    3.执行虚拟环境目录中Scripts下的activate文件可启用虚拟环境、deactivate文件可退出虚拟环境,
    具体命令如下:
    C:\Users\admin>.\first_env\Scripts\activate
    C:\Users\admin>.\first_env\Scripts\deactivate
    4.若以上命令执行成功,命令行的路径名之前会出现“(虚拟环境名)”,具体如下所示
    (first_env) C:\Users\admin>
    5.输入python,检验是否安装成功
    任务一: 在windows 中安装 python 虚拟环境 : my_env ,在D:/myEnvs目录下:
    2.2 虚拟环境管理工具virtualenvwrapper 安装
    用户可通过虚拟环境管理工具virtualenvwrapper简化虚拟环境的创建和管理,在Windows系统中安装
    该工具,具体命令如下:
    pip install virtualenvwrapper-win
    安装完成后,用户可分别使用以下命令创建和管理虚拟环境
    说明 命令
    创建虚拟环境 mkvirtualenv env
    启用虚拟环境 workon env
    退出虚拟环境 deactivate
    删除虚拟环境 rmvirtualenv env
    查看虚拟环境列表 lsvirtualenv/workon
    进入当前虚拟环境所在目录 cdvirtualenv
    任务2: 使用virtualenvwrapper工具创建python 虚拟环境first_env
    2.3 使用pip安装Django
    Django对Python版本的依赖关系具体如下表所示
    Django其实也是Python内置的包,可以通过pip工具管理
    安装Django
    pip install django==2.2.8
    验证虚拟环境安装是否成功
    三、Django项目搭建
    学习目标
    创建项目工程
    创建应用
    了解工程目录结构
    定义视图与路由
    3.1 新建Django项目
    使用Django提供的命令,可以创建一个Django项目实例需要的配置项——包括数据库配置、Django配
    置和应用程序配置的集合。新建Django项目命令的语法格式如下:
  5. 创建项目
    创建工程的命令为:
    例如:想要在D:\的pythonProject目录中创建一个名为mysite的项目工程,可执行如下命令:
    执行后,会多出一个新目录名为mysite,此即为新创建的工程目录。
  6. 项目目录说明
    查看创建的项目目录,结构如下
    mysite : 根目录,项目的容器
    manage.py:一个提供Django项目管理功能的命令行工具
    子mysite:一个纯Python包,其中存放项目文件,在引用项目文件时会使用到这个包名。
    mysite\settings.py 是项目的整体配置文件。
    mysite\urls.py 是项目的URL配置文件。
    mysite\wsgi.py 是项目与WSGI兼容的Web服务器入口。
    django-admin startproject 工程名称
    workon first_env
    cd d:\pythonProject
    django-admin startproject mysite
    3.启动项目
    在开发阶段,为了能够快速预览到开发的效果,django提供了一个纯python编写的轻量级web服
    务器,仅在开发阶段使用。
    运行服务器命令如下:
    可以不写IP和端口,默认IP是127.0.0.1,默认端口为8000。
    启动后可见如下信息:
    在浏览器中输入网址“127.0.0.1:8000”便可看到效果。
    django默认工作在调式Debug模式下,如果增加、修改、删除文件,服务器会自动重启。
    按ctrl+c停止服务器。
    默认情况下开发服务器在本地IP的8000端口上启动,若要更改端口,可将端口作为命令行参数传
    递。例如在端口8080上启动服务器,命令如下所示:
    python manage.py runserver 8080
    任务三: 创建Django项目 mysite
    3.2 创建应用
    python manage.py runserver ip:端口
    或:
    python manage.py runserver
    在Web应用中,通常有一些业务功能模块是在不同的项目中都可以复用的,故在开发中通常将工程
    项目拆分为不同的子功能模块,各功能模块间可以保持相对的独立,在其他工程项目中需要用到某个特
    定功能模块时,可以将该模块代码整体复制过去,达到复用。
    在Django中, 把这一个个子功能模块成为 应用 ,一个Django项目可以包含多个Django应用,每个
    应用可在多个项目中被重复利用
  7. 创建应用
    在django中,创建应用模块目录可以通过命令来操作,即:
    manage.py 为上述创建工程时自动生成的管理文件。
    例如,在刚才创建的mysite工程中,想要创建一个用户users应用模块,可执行:
    执行后,可以看到工程目录中多出了一个名为blogs的子目录。
  8. 应用目录说明
    查看此时的工程目录,结构如下:
    python manage.py startapp 应用名称
    admin.py 文件: 跟网站的后台管理站点配置相关。
    apps.py 文件: 用于配置当前应用的相关信息。
    migrations 目录: 用于存放数据库迁移历史文件。
    models.py 文件: 用户保存数据库模型类。 m : model v: view T: Template
    tests.py 文件: 用于开发测试用例,编写单元测试。
    views.py 文件: 编写视图函数,MVT模型中的V。
    db.sqlite3 : 轻量级关系型数据库,django默认使用sqlite数据库
    任务4: 在mysite项目中创建users应用
  9. 注册应用
    创建出来的子应用目录文件虽然被放到了工程项目目录中,但是django工程并不能立即直接使用该应
    用,需要注册安装后才能使用。
    在工程配置文件settings.py中,INSTALLED_APPS项保存了工程中已经注册安装的子应用,初始工程中
    的INSTALLED_APPS如下:
    注册安装一个应用的方法,即是将子应用的配置信息文件apps.py中的Config类添加到
    INSTALLED_APPS列表中。
    例如,将刚创建的users子应用添加到工程中,可在INSTALLED_APPS列表中添
    加’users.apps.UsersConfig’。
    提示:在pycharm中 打开Django项目
    找到项目的根目录,打开Django项目
    设置项目的python解析器(虚拟环境)
    3.3 创建视图、定义路由
    Django的视图是定义在应用的views.py中的。
  10. 创建视图:
    打开刚创建的users模块,在views.py中编写视图代码。
    说明:
    视图函数的第一个传入参数必须定义,用于接收Django构造的包含了请求数据的HttpReqeust对
    象,通常名为request。
    视图函数的返回值必须为一个响应对象,可将要返回的字符串数据放到一个HTTPResponse对象
    中。
  11. 定义路由URL
    为了保证服务器能成功找到用户请求的页面,需为应用配置路由。在应用users中创建子路由文件
    urls.py,分别配置根路由和子路由,配置信息分别如下:
  1. 在应用中新建一个urls.py文件用于保存该应用的路由。
    from django.http import HttpResponse
    def index(request):
    “”"
    index视图
    :param request: 包含了请求信息的请求对象
    :return: 响应对象
    “”"
    return HttpResponse(“hello the world!”)
  2. 在users/urls.py文件中定义子路由信息。
  3. 在项目工程总路由mysite/urls.py中添加users应用的路由信息。
    使用include来将子应用users里的全部路由包含进项目路由中;
    ‘users/’ 决定了users应用的所有路由都已/users/开头,如我们刚定义的视图index,其最终的完
    整访问路径为/users/index/。
    3.4 启动运行
    1.命令方式启动django项目
    python manage.py runserver
    from django.urls import path
    from . import views

urlpatterns是被django自动识别的路由列表变量

urlpatterns = [

每个路由信息都需要使用url函数来构造

url(路径, 视图)

path(‘index/’, views.index),
]
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path(‘admin/’, admin.site.urls),
path(‘users/’, include(‘users.urls’))
]
2.pycharm中直接运行项目
3.运行效果
在浏览器中输入网址127.0.0.1:8000/users/index/ 可看到返回的信息
回顾MVT模型
补充
1.直接在 物理环境中安装django ,不使用虚拟环境
2.在pycharm中直接创建Django项目
1.创建Django项目
2.修改Django版本
使用pycharm创建Django项目时默认使用最新的版本
修改Django版本
当安装成功后,再打开项目解析器设置,效果如下:
3.修改settings.py文件
导入os模块
import os
修改DATAASES配置
4.删除asgi.py文件
四、后台数据管理
一个站点或者网站,除了给用户浏览及操作外,还需要对后台数据进行管理,比如添加商品,修
改商品等等。
Django提供了一个可插拔的后台管理系统——Admin 应用,该系统可以从模型中读取元数据,并
提供以模型为中心的界面。Admin后台管理系统不仅让管理员可以便捷地管理、发布、维护网站
的内容,也为开发人员节约了大量开发时间。本章节将对Admin管理系统进行介绍。
学习目标:
掌握进入后台管理系统的方法
掌握模型的注册方法
熟悉ModelAdmin的选项
了解Admin认证和授权
1.认识Admin后台管理页面
1.1 进入Admin
1)Django项目的根urls.py文件中默认定义了一个“/admin/”路由,该路由指向Admin
2)启动Django项目,在浏览器中输入“http://127.0.0.1:8000/admin/”,页面会跳转到后台管理系
统的登录页面
3)数据库迁移
生成迁移文件,即生成sql语句
python manage.py makemigrations
执行迁移文件,即执行sql语句
python manage.py migrate
4)登录后台管理系统需要输入管理员用户名与密码,此时可在命令终端通过“python manage.py
createsuperuser”命令创建管理员用户
提示:
以上示例中的电子邮件可为空,密码长度至少为8个字符(非强制),输入的密码不会在屏幕显
示。创建完成后的管理员用户信息会被存储在auth_user表中
5) 登录成功后进入站点管理界面

6)管理界面本地化
首次登录之后是英文界面,后台管理是给管理员使用的,英文界面阅读起来就比较困难了,这里可
以将后台管理本地 化。 本地化是将显示的语言、时间等使用本地的习惯,这里的本地化就是进行中国
化,中国大陆地区使用简体中文, 时区使用亚洲/上海时区,注意这里不使用北京时区表示。
两种方式可以将Admin系统的语言本地化
在seetings.py文件中将配置项LANGUAGE_CODE的值设置为“zh-Hans” ,TIME_ZONE的值设置
为"Asia/Shanghai"
在seetings.py文件中配置项MIDDLEWARE中添加本地化中间件
“django.middleware.locale.LocaleMiddleware”
任务: 进入admin站点管理系统
1.2 使用Admin 对数据库中的数据操作 --》 模型

  1. 注册模型
    若想使Admin系统中呈现自定义的模型数据,需在应用的admin.py文件中将模型注册到后台系
    统。
    使用装饰器@admin.register()注册模型
    使用admin.site.register()注册模型
    提示:
    需提前在应用的models.py文件中添加模型类
    效果如下:
    修改应用的显示名称
    在goods应用的 init.py 文件中添加如下设置
    在goods/apps.py文件中使用verbose_name设置应用的名称

语法 @admin.register(模型名)

from django.contrib import admin
from .models import Goods

装饰器的方式

@admin.register(Goods)
class xxx

语法 admin.site.register(模型名)

admin.site.register(Goods)
from django.db import models

Create your models here.

class Goods(models.Model):
name = models.CharField(max_length=50, verbose_name=‘商品名’) # 商品名称
default_app_config = ‘goods.apps.GoodsConfig’
修改模型显示的名称
任务2: 创建商品模型,且在后台管理界面显示
2) 模型数据的增删改
对Goods模型添加字段等属性
from django.apps import AppConfig
class GoodsConfig(AppConfig):
name = ‘goods’
verbose_name = ‘商品信息’

gppds/models.py

from django.db import models

Create your models here.

class Goods(models.Model):
class Meta:
verbose_name = ‘商品’ # 模型名称(单数)
verbose_name_plural = verbose_name # 模型名称(复数)
from django.db import models

Create your models here.

class Goods(models.Model):
create_time = models.DateTimeField(auto_now_add=True, verbose_name=“创建
时间”)
update_time = models.DateTimeField(auto_now=True, verbose_name=“更新时
间”)
name = models.CharField(max_length=50, verbose_name=‘商品名’)
price = models.DecimalField(max_digits=10, decimal_places=2,
verbose_name=‘价格’)
stock = models.IntegerField(default=0, verbose_name=‘库存’)
sales = models.IntegerField(default=0, verbose_name=‘销量’)
class Meta:
db_table = ‘tb_goods’ # 数据表名
verbose_name = ‘商品’ # 模型名称(单数)
verbose_name_plural = verbose_name # 模型名称(复数)
在django shell中执行 数据库迁移 命令
python manage.py makemigrations #生成迁移文件
python manage.py migrate #执行迁移文件
在admin 页面对goods模型 实现增、删、改等操作
增加商品
修改或删除商品
删除商品
def str(self):
return ‘%s:%s’ % (self.id, self.name)
2.定制Admin后台管理页面
在使用默认的admin管理页面时,当不满足需求时,就需要定制Admin的后台管理页面
ModelAdmin类主要用于控制模型信息在Admin后台页面中的展示, ModelAdmin类包含了诸多
选项,包括列表页选项、编辑页选项,管理员可以通过这些选项灵活地控制要呈现的数据
2.1 定制列表页选项
常用的列表页选项有:
1)list_display选项
list_display选项用于控制页面展示的字段,该选项的值为元组或列表类型,其中的元素可以是模
型字段或自定义字段
在应用的admin.py文件中定义
方式1:
方式2:

方式一

@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
显示自定义字段
自定义字段指与模型相关,但并不包含在模型中的字段,这种字段是定义在应用的admin.py
文件中的一些函数,这些函数会将模型实例作为参数
2)list_display_links选项
用于设置需在页面中以链接形式展示的字段,可跳转到详情页面

方式二

class GoodsAdmin(admin.ModelAdmin):
list_display = (‘name’, ‘price’, ‘stock’, ‘sales’, ‘create_time’,
‘update_time’)
admin.site.register(Goods, GoodsAdmin)
#admin.py
def sales_volume(g):
total = g.price * g.sales
return f’{g.name}销售额为:{total}’
sales_volume.short_description = ‘商品销售额’ # 设置字段描述
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’, sales_volume)
提示:
默认第一个显示字段有链接跳转,假如设置了list_display_links,则依据list_display_links指定的字段
设置链接
3)list_filter选项
list_filter选项用于开启列表页过滤器,该选项可以接收模型中的字段作为过滤条件

admin.py

@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘id’,‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
list_display_links = (‘id’,‘name’,) # 设置字段链接

admin.py

@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘id’,‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
list_display_links = (‘id’,‘name’) # 设置字段链接
list_filter = [‘sales’, ‘name’] # 过滤器
4)list_per_page选项
使用list_per_page选项可以设置每页显示的数据量
5) list_editable选项
list_editable选项用于设置可编辑的字段,字段若被指定为编辑字段,页面上可直接编辑该字段。
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
list_display_links = (‘name’,) # 设置字段链接

list_filter = [‘sales’, ‘name’] # 过滤器

list_per_page = 5 # 每页展示5条记录
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)

list_display_links = (‘name’,) # 设置字段链接

list_filter = [‘sales’, ‘name’] # 过滤器

list_per_page = 5 # 每页展示5条记录

list_editable = (‘price’,) # 设置商品价格price为可编辑字段
提示:list_display_links与list_editable不能同时设置同一字段
6)search_fields选项
search_fields选项用于配置搜索字段
7) actions_on_top选项
actions_on_top选项用于设置是否在顶部显示动作下拉框,默认为True,表示在顶部显示。
8) actions_on_bottom 选项
actions_on_bottom选项用于设置管理员动作是否在底部显示,默认为False,表示不在底部显
示,当设置为True表示在底部显示。
search_fields = (‘name’,‘id’) # 表示以name,id 作为搜索字段
任务:定制后台管理的列表页面
2.2 定制编辑页选项
单击列表页面中的id等字段后,页面会跳转到相应记录的编辑页。通过编辑页选项可以控制在编
辑页显示的字段、设置字段分组、将字段设置为只读等,这些选项在应用的admin.py文件的模型
管理类中使用
1)fields选项
fields选项用于控制编辑页要显示的字段,它的值是元组类型
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘id’, ‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
actions_on_top = False
actions_on_bottom = True # 在底部显示管理员动作

goods/admin.py

@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘id’, ‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
fields = (‘name’, ‘price’, ‘stock’)
fields选项支持以二维元组形式设置字段分栏显示,在fileds中一个元组表示一栏数据
2)fieldsets选项
fieldsets选项用于对可编辑字段进行分组,该选项不可与fields选项同时使用

goods/admin.py

@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘id’, ‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
fields = ((‘name’, ‘price’),(‘stock’, ‘sales’))
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘id’, ‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
fieldsets = (
(‘商品基本信息’, {‘fields’: [‘name’, ‘stock’, ‘sales’]}),
(‘商品价格信息’, {‘fields’: [‘price’]})
)
3)编辑页其他选项
任务:定制后台管理的编辑页面
3.认证和授权
Admin提供管理用户与组、用户与组权限的功能,使用超级用户登录后台管理系统后可以对用户
或组进行增加,或变更用户与组的权限
3.1 用户管理
3.2 组管理
组的作用是批量对用户的权限进行管理和分配,将一个用户加入到一个组中,该用户就拥有了该
组所拥有的所有权限,如此可避免逐个管理具有相同权限的用户,减少工作量,提高管理效率
3.3 权限管理

  1. 单击选择用户来修改页面中的用户名称可进入修改用户页面。修改用户页面中包含账号信息、个人信
    息、权限、重要日期四组数据信息,其中账号信息中包含用户名和密码
  2. 使用当前登录的超级用户可以将当前管理的用户添加到指定组中
    3)选中左侧列表框的权限,单击“ ”按钮可将权限移动到右侧列表框中,方可为用户赋予权限
    4)在Admin站点管理页面单击“组”进入选择组来修改页面,在该页面中单击组名称进入修改组页面,修
    改组页面中可为指定的组设置权限
    任务:分别创建两个用户和两个组,分别对组设置权限,且用户添加到组中
    五、网页展示
    通过Admin后台管理,保存了商品数据到数据库,那下面应该就是以网页的形式把商品呈现给客

    5.1 商品列表首页展示
  3. 在views通过Model获取要展示的数据
  4. 准备商品首页的模板网页
    settings.py配置模板页路径
    from django.shortcuts import render
    from django.http import HttpResponse
    from django.shortcuts import render
    from .models import Goods

Create your views here.

def index(requst):
“”“首页”""

通过模型获取数据库中的商品列表数据

goods_list = Goods.objects.all()
print(goods_list)
return HttpResponse(“商品首页”)
index.html模板页面

在线商城

商品详情

商品名称: {{ goods.name }}
商品价格: {{ goods.price }}
上架时间: {{ goods.create_time }}
6) 测试效果 from django.shortcuts import render from .models import Goods def detail(request): # 通过request 获取请求参数 goods_id = request.GET.get('id') # 查询具体某个商品的信息 goods = Goods.objects.get(id=goods_id) goods.create_time = goods.create_time.date() # 传给模板的参数 context = {'goods': goods} return render(request, 'detail.html', context)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值