python Django框架基础知识概述

Django框架基础知识概述

1. Django安装

  1. 使用pip安装django
    正常使用pip安装django:
pip install django

这样默认会从pypi的服务器下载django包,速度比较慢。
2. 使用国内镜像源
可以使用豆瓣的pypi镜像源来安装:

pip install -i https://pypi.doubanio.com/simple/ django

或使用阿里云的镜像源:

pip install -i http://mirrors.aliyun.com/pypi/simple/ django 
  1. 检查安装版本
    安装完成后的版本号:
python -m django --version

2. Django项目创建

使用django-admin创建项目
运行命令django-admin startproject projectname可以创建一个项目,projectname是项目名称。
这个命令会生成一个项目目录,包含初始化的项目文件。
项目目录结构
生成的项目目录包含:

  • manage.py: 管理工具脚本
  • projectname/: 项目包
    • init.py: 初始化文件
    • settings.py: 项目配置
    • urls.py: URL声明
    • wsgi.py: WSGI服务器入口
      settings.py配置
      settings.py包含了项目的所有配置,比如INSTALLED_APPS、数据库连接、语言等配置。
      启动开发服务器
      可以通过python manage.py runserver启动项目的开发服务器,用于开发调试。

3. Django应用创建

Django项目由一个或多个应用组成,每个应用实现特定功能。
在项目中创建应用
可以使用命令python manage.py startapp app01来创建一个应用。
这个命令会生成一个应用目录及初始化文件。
应用目录结构
一个应用通常包含以下文件:

  • views.py: 视图逻辑
  • models.py: 数据模型
  • tests.py: 测试用例
  • apps.py: 应用配置
    注册应用
    创建完应用需要在settings.py的INSTALLED_APPS中注册该应用,才能被Django项目使用。
    例如:
INSTALLED_APPS = [
    'app01',
    ...
]

创建应用是按功能拆分项目的重要方式。应用包含独立功能的代码和文件,需要注册才能启用。这样可以构建模块化、可扩展的项目。

django配置文件的使用

Django配置文件是一个Python文件,通常命名为settings.py,用于配置Django项目的各种设置和选项。以下是一些常用的Django配置选项:

1.注册APP/应用

在 Django 中,每个应用程序都被视为一个独立的模块,包含了一些特定的 Python 代码和模板文件。通过将应用程序的模块路径添加到 INSTALLED_APPS 列表中,Django 可以找到并加载这些应用程序,以便在项目中使用。

以下是一个示例的 INSTALLED_APPS 列表:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 注册APP01
    'app01',# 自己创建的app
]

在这个示例中,django.contrib.admindjango.contrib.auth 等内置应用程序的模块路径被添加到了 INSTALLED_APPS 列表中。此外,还添加了一个名为 app01 的第三方应用程序的模块路径。通过添加这些模块路径,Django 将自动加载并安装这些应用程序,以便在项目中可以使用它们。

2.中间件

中间件是一种可插入的组件,它能够在一个请求/响应循环中拦截和处理请求或响应。通过使用中间件,你可以在请求被处理之前和之后执行自定义的逻辑,例如身份验证、授权、日志记录等。

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",#跨站请求伪造(CSRF)保护、点击劫持防护、密码重置功能等。
    "django.contrib.sessions.middleware.SessionMiddleware",#责处理用户的会话。它将在每个请求中查找会话信息,并将其添加到请求对象中。如果会话不存在,它将在服务器上创建一个新的会话。
    "django.middleware.common.CommonMiddleware",#包含了一些通用的处理逻辑,例如重定向、静态文件服务等。
    "django.middleware.csrf.CsrfViewMiddleware",#提供了跨站请求伪造(CSRF)保护。它将在每个视图函数中检查请求中是否存在有效的CSRF令牌。如果没有,它将返回一个错误响应。
    "django.contrib.auth.middleware.AuthenticationMiddleware",#负责处理用户的认证。它将在每个视图函数中检查请求中是否存在有效的用户认证信息。如果没有,它将重定向到登录页面。
    "django.contrib.messages.middleware.MessageMiddleware",#负责处理消息提示。它将在每个视图函数中检查请求中是否存在需要显示的消息提示,并将其添加到请求对象中。
    "django.middleware.clickjacking.XFrameOptionsMiddleware",#提供了点击劫持防护。它将在每个响应中添加X-Frame-Options头,以防止页面被嵌入到其他页面中。
    "app01.MD1.MD1"#自己写的中间件

]

3. 配置HTML模板

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [],
        "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",
            ],
        },
    },
]
  • BACKEND:这里是Django默认的模板,也就是django.template.backends.django.DjangoTemplates
  • DIRS:一个列表,指定了模板搜索的目录。这里没有指定任何目录,所以Django会使用默认的设置。
  • APP_DIRS:这个选项决定了Django是否会搜索每个已安装的应用的模板目录。如果设为True(这是默认值),Django会在每个已安装的应用的templates目录下查找模板。
  • OPTIONS:这是一个包含模板选项的字典。这里定义了context_processors,这是用于生成模板上下文的处理器。这些处理器会为每个请求生成一个上下文,该上下文可以在模板中使用。

4.数据库配置

# 定义一个名为 DATABASES 的字典,用于存储数据库配置信息
DATABASES = {
    # 定义一个名为 "default" 的数据库配置,这是默认使用的数据库配置
    "default": {
        # 指定数据库引擎,这里使用的是 Django 默认的 MySQL 数据库引擎
        "ENGINE": "django.db.backends.mysql",
        # 指定数据库名称,这里命名为 "xmm"
        "NAME":"xmm",
        # 指定连接数据库的用户名,这里使用的是 "admin"
        "USER":"admin",
        # 指定连接数据库的密码,这里使用的是 "123456"
        "PASSWORD":"123456",
        # 指定数据库服务器地址,这里使用的是本地地址 "127.0.0.1"
        "HOST":"127.0.0.1",
    }
}

5.语言

LANGUAGE_CODE = "en-us"#英文
LANGUAGE_CODE = "zh-cn"#中文

6.静态文件

STATIC_URL = "static/"

7.媒体文件

 MEDIA_URL  = “media/

4.django视图

  1. 函数视图(Function View): 最简单的视图,就是一个接收request参数、返回response对象的Python函数。
def index(request):
    return HttpResponse('Hello World')
  1. 类视图(Class-based View): 基于类的视图,可以通过继承重用代码。Django提供了许多内置的通用类视图。
from django.views.generic import TemplateView 

class IndexView(TemplateView):
    template_name = 'index.html'
  1. 装饰器视图(Decorator View): 通过装饰器为视图函数添加额外功能,如登录验证等。
from django.contrib.auth.decorators import login_required

@login_required
def index(request):
    pass

4.我常用的视图

  • reverse用于根据视图名称、URL参数等反向生成URL,通常用于重定向或者模板中的URL
  • render用于结合给定的模板和上下文渲染出一个HttpResponse响应。
  • redirect用于重定向到一个指定的URL。
    在Django中,reverse是一个用于反向解析URL的函数。它允许您通过名称和参数来生成一个URL。这对于在代码中构建动态URL非常有用。

reverse:生成动态URL

下面是一个示例,展示如何使用reverse函数:

from django.urls import reverse

# 假设您有一个名为"post_detail"的视图函数,对应的URL名称为"post_detail"
# 在模板中,您可以使用reverse来生成该视图的URL

url = reverse('post_detail', args=[post.id])

在上面的示例中,post_detail是URL的名称,args是一个列表,用于传递URL参数。在这个例子中,我们传递了一个名为post.id的参数。

您还可以使用命名参数来传递参数。例如:

url = reverse('post_detail', kwargs={'post_id': post.id})

render

在这个例子中,我们使用kwargs(关键字参数)来传递参数。参数名称是post_id,对应的值是post.id

render函数的主要作用是结合模板和数据,向前端返回完整的渲染结果。
render函数的典型用法如下:

from django.shortcuts import render

def index(request):
    context = {'name': 'John'}
    return render(request, 'index.html', context)

这里render函数接受三个参数:

  • request: 请求对象
  • ‘index.html’: 渲染使用的模板
  • context: 渲染模板使用的上下文数据
    render会结合index.html模板和context上下文,渲染出完整的HTML页面,以HttpResponse对象形式返回。

redirect

在Django中,重定向(redirect)是一种将用户从一个URL自动重定向到另一个URL的技术。重定向通常用于在用户完成某个任务后将他们重定向到另一个页面,或者在用户提交表单后重定向到另一个页面。

在Django中,您可以使用redirect函数来进行重定向。以下是一些示例:

  1. 重定向到另一个URL:
from django.shortcuts import redirect

def my_view(request):
    # ...
    return redirect('name')

在上面的示例中,当用户访问my_view时,被重定向到名为another_view_name的另一个视图。

  1. 重定向到另一个URL,并传递参数:
from django.shortcuts import redirect

def my_view(request):
    # ...
    param1 = 'value1'
    param2 = 'value2'
    return redirect('mane', param1, param2)

5. Django路由设置

Django使用urls.py文件来定义URL路由。

  • urls.py文件:路由文件
    project/urls.py是项目的总路由文件,每个app可以有自己的urls.py文件。
  • path()函数:函数设置路由
# urls.py 

from django.urls import path, include # 导入path和include

urlpatterns = [

  # 定义带year整数参数的文章归档路径
  path('articles/<int:year>/', views.year_archive, name='archive'), 
  
  # 包含books子路由,添加命名空间
  path('books/', include('books.urls', namespace='books')) 

]

# books/urls.py

from django.urls import path

urlpatterns = [

  # 定义带book_title字符串参数的章节路径
  path('<slug:title>/chapters/', views.chapters, name='chapters'),

]

注释点:

  1. path和include用于定义路由
  2. int:year等用于捕获路径参数
  3. name
  • 给一个path()路径起一个别名。
  • 用于通过这个别名反向生成URL。
  1. namespace
  • 给一个include的路由集分配一个命名空间。
  • 避免同名的name在不同的include中发生冲突。
  1. namespace隔离命名空间,避免反向解析冲突
  2. include包含子路由模块

6. Django模板

  1. 模板语言语法
    Django模板语言使用{{ var }}表示变量,{% tag %}表示逻辑标签。模板通过这些语法实现独立的渲染逻辑。
  2. 模板标签:{% tag %}语法,用于流程控制、循环等逻辑。如{% if %}、{% for %}等。
  3. 模板过滤器:{{ var|filter }}语法,用于修改变量显示。如{{ name|lower }}转小写。
  4. 模板继承:base.html定义布局,子模板继承后填充 BLOCK。
  5. loader加载模板
    可以使用loader.get_template()加载模板文件。
  6. render() : 在视图中使用render()渲染模板。
  7. Context: render()时需要传入context字典,提供模板渲染所需变量。
    示例:
# view
from django.shortcuts import render # 从django.shortcuts导入render函数

def index(request):

  # 使用loader加载名为index.html的模板文件
  t = loader.get_template('index.html') 
  
  # 构造context字典,包含模板渲染所需的name变量
  context = {'name': 'John'}

  # 调用render函数渲染模板
  # 需要传入request、模板文件名、context
  return render(request, 'index.html', context)
<!-- index.html模板 -->

{% extends 'base.html' %} # 继承base.html模板

{% block title %}Home{% endblock %} # 填充title块

{% block content %} # 填充content块

<h1>Hello {{ name|upper }}!</h1> # 输出name变量,使用upper过滤器转换大写

{% endblock %} # 关闭content块

总结:

  • render函数渲染模板
  • loader可加载模板文件
  • context字典提供渲染所需变量
  • 模板使用extends、block实现继承
  • 输出变量、使用过滤器修改输出

7. Django ORM数据库模型

以下是Django中常见的数据库模型数据类型:

字段名数据类型描述
IntegerField整数类型用于存储整数数据
PositiveIntegerField正整数类型用于存储正整数数据
NegativeIntegerField负整数类型用于存储负整数数据
AutoField自动增长整数类型用于存储自增整数数据,常用于主键
BigIntegerField大整数类型用于存储大整数数据
DecimalField小数类型用于存储小数数据,可以指定小数点位数和精度
CharField字符串类型用于存储字符串数据,可以指定最大长度
TextField长文本类型用于存储大量文本数据
BooleanField布尔类型用于存储布尔值数据,可以存储True或False值
NullBooleanField空值布尔类型用于存储空值布尔值数据,可以存储True、False或空值
DateTimeField日期时间类型用于存储日期时间数据,可以指定日期时间格式
DateField日期类型用于存储日期数据,可以指定日期格式
TimeField时间类型用于存储时间数据,可以指定时间格式
EmailField电子邮件类型用于验证和存储电子邮件地址数据
GenericIPAddressField通用IP地址类型用于存储IP地址数据,可以存储IPv4或IPv6地址
PositiveSmallIntegerField正小整数类型用于存储正小整数数据
SmallIntegerField小整数类型用于存储小整数数据
URLFieldURL类型用于验证和存储URL数据
SlugField缩略词类型用于存储短字符串,常用于URL中
FileField文件类型用于存储上传的文件数据
ImageField图像类型用于存储上传的图像数据

Django数据库模型的一些常见属性和方法:

属性/方法描述
字段(Fields)- 字段名(Field name):字段的唯一标识符,通常使用驼峰命名法。
- 数据类型(Data type):用于定义字段可以存储的数据类型,例如整数、字符串、日期等。
- 参数(Parameters):用于进一步定义字段的行为或限制,例如最大长度、默认值等。
- 主键(Primary key):如果该字段被指定为模型的主键,则会有一个主键约束。
- 外键(Foreign key):如果该字段引用了另一个模型的主键,则会有一个外键约束。
- 空值(Null):指定该字段是否允许存储空值。
- 默认值(Default):为该字段指定默认值。
方法(Methods)- 构造函数(Constructor):用于创建模型的实例对象。
- 访问器(Accessor):用于访问模型实例的属性或字段。
- 修改器(Mutator):用于修改模型实例的属性或字段的值。
- 校验器(Validator):用于验证模型实例的属性或字段的值是否符合特定规则。
- 清理器(Cleaner):用于在保存模型实例之前对数据进行清理和验证。
关联(Associations)- 一对一关联(One-to-one association):如果两个模型之间存在一对一关系,则可以使用一对一关联进行连接。
- 一对多关联(One-to-many association):如果一个模型与另一个模型之间存在一对多关系,则可以使用一对多关联进行连接。
- 多对多关联(Many-to-many association):如果两个模型之间存在多对多关系,则可以使用多对多关联进行连接。
管理方法(Manager methods)- objects:用于获取模型的所有实例对象。
- create():用于创建一个新的模型实例对象并返回该对象的实例。
- get(id):用于根据主键获取一个模型实例对象。
- filter(条件):用于根据条件过滤模型实例对象集合。
- exclude(条件):用于排除符合特定条件的模型实例对象集合。
- order_by(字段):用于对模型实例对象集合进行排序。
  • 定义模型类
  • 在Django中,模型类是用于定义数据库表的。模型类是定义在app的models.py文件中的类,它继承自Django的Model基类。

以下是一个简单的Django模型类的示例:

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

这个模型类定义了一个名为Blog的数据库表,其中包含三个字段:title(标题)、description(描述)和created(创建时间)。字段类型分别是CharField、TextField和DateTimeField。

  • 迁移生成表
    Django是一个Python Web框架,它使用ORM(对象关系映射)来处理数据库操作。在Django中,数据库模型通常定义在一个名为models.py的文件中,并通过python manage.py makemigrationspython manage.py migrate命令迁移到数据库中。
  • 模型实例化和保存
    在Django中,可以通过以下步骤来实例化并保存模型:
  1. 导入模型类:首先,需要导入需要使用的模型类。例如,如果有一个名为Blog的模型类,可以将其导入:
from myapp.models import Blog
  1. 实例化模型:接下来,可以通过创建模型类的实例来实例化模型。例如,可以使用以下代码创建一个Blog实例:
blog = Blog()
  1. 设置属性:可以通过赋值给实例的属性来设置模型的属性值。例如,可以使用以下代码为Blog实例的title属性赋值:
blog.title = "My Blog"
  1. 保存模型:最后,可以使用save()方法将模型实例保存到数据库中。例如,可以使用以下代码保存blog实例:
blog.save()

这将在数据库中创建一个新的记录,并将blog实例的属性值保存到相应的数据库表中。

8.Django ORM数据库模型操作方法

-增加数据库数据

方法描述
save()创建一个实例,然后调用实例的save()方法将其保存到数据库。
create()直接创建并保存一个实例,无需先调用实例的save()方法。
bulk_create()批量创建多个实例,并将它们一次性保存到数据库。
在Django中,增加数据库数据的方法有以下几种:
  1. 使用模型的save()方法:
from myapp.models import MyModel

# 创建一个实例
my_instance = MyModel(field1='value1', field2='value2')

# 保存到数据库
my_instance.save()
  1. 使用create()方法:
from myapp.models import MyModel

# 创建并保存一个实例
MyModel.objects.create(field1='value1', field2='value2')
  1. 使用bulk_create()方法(批量创建):
from myapp.models import MyModel

# 创建多个实例
instances = [MyModel(field1='value1', field2='value2'), MyModel(field1='value3', field2='value4')]

# 批量保存到数据库
MyModel.objects.bulk_create(instances)

-删除数据库数据

方法描述
delete()删除所有实例,调用模型的delete()方法即可。
filter() + delete()删除满足条件的所有实例,使用filter()方法过滤出需要删除的对象,然后调用delete()方法进行删除。
iterator() + delete()适用于大量数据的删除,先使用iterator()方法获取QuerySet中的所有对象,然后逐个调用delete()方法进行删除。

删除数据库数据的方法有以下几种:

  1. 使用模型的delete()方法:
from myapp.models import MyModel

# 删除所有实例
MyModel.objects.all().delete()
  1. 使用filter()方法结合delete()方法:
from myapp.models import MyModel

# 删除满足条件的所有实例
MyModel.objects.filter(field_name='value').delete()
  1. 使用delete()方法配合QuerySetiterator()方法(适用于大量数据):
from myapp.models import MyModel

# 删除所有实例
for obj in MyModel.objects.all().iterator():
    obj.delete()

注意:可以和其他的查询方法+删除使用

- 修改数据库数据

方法描述
update()修改所有实例的字段值,调用模型的update()方法即可。
filter() + update()修改满足条件的所有实例的字段值,使用filter()方法过滤出需要修改的对象,然后调用update()方法进行修改。
iterator() + update()适用于大量数据的修改,先使用iterator()方法获取QuerySet中的所有对象,然后逐个修改字段值并调用save()方法进行保存。
在Django中,修改数据库数据的方法有以下几种:
  1. 使用模型的update()方法:
from myapp.models import MyModel

# 修改所有实例的字段值
MyModel.objects.all().update(field_name='new_value')
  1. 使用filter()方法结合update()方法:
from myapp.models import MyModel

# 修改满足条件的所有实例的字段值
MyModel.objects.filter(field_name='old_value').update(field_name='new_value')
  1. 使用update()方法配合QuerySetiterator()方法(适用于大量数据):
from myapp.models import MyModel

# 修改所有实例的字段值
for obj in MyModel.objects.all().iterator():
    obj.field_name = 'new_value'
    obj.save()

注意:可以和其他的查询方法+修改使用

- 查询数据库数据

以下是Django查询API的一些常用方法及其用法:

方法名用法
all()MyModel.objects.all() 返回包含所有对象的查询集(QuerySet)
filter(**kwargs)MyModel.objects.filter(name='John', age=30) 根据给定的条件过滤对象,可以传入多个关键字参数
exclude(**kwargs)MyModel.objects.exclude(name='John', age=30) 排除满足给定条件的对象,与filter()方法类似,可以传入多个关键字参数
get(**kwargs)MyModel.objects.get(name='John', age=30) 根据给定的条件获取单个对象,如果找不到匹配的对象,将引发DoesNotExist异常,可以传入多个关键字参数
first()MyModel.objects.first() 返回查询集中的第一个对象,如果没有找到匹配的对象,将返回None
last()MyModel.objects.last() 返回查询集中的最后一个对象,如果没有找到匹配的对象,将返回None
count()MyModel.objects.count() 返回查询集中的对象数量
exists()MyModel.objects.exists() 检查查询集中是否存在至少一个对象
values(**fields)MyModel.objects.values('name', 'age') 返回一个包含字典的查询集,其中每个字典表示一个对象的属性值,可以传入一个或多个字段名作为关键字参数
values_list(**fields)MyModel.objects.values_list('name', 'age') 返回一个包含元组的查询集,其中每个元组表示一个对象的属性值,可以传入一个或多个字段名作为关键字参数

代码太多了,不想写,自己看表

9.关于表单

推荐使用ModelForm,不要用forms.Form

Django ModelForm是Django中用于处理表单的类,基于模型,允许将表单与数据库中的模型关联起来。ModelForm提供了一些额外的功能,如自动生成表单字段、验证表单数据等。

以下是Django ModelForm的一些主要使用方法:

  1. 定义模型类:首先需要定义一个模型类,然后让ModelForm继承这个模型类。例如:
from django.db import models
from django.forms import ModelForm

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

class PersonForm(ModelForm):
    class Meta:
        model = Person
        fields = ['name', 'age']

在这个例子中,我们定义了一个Person模型类和一个PersonForm表单类。PersonForm继承了Person模型类,并指定了表单中的字段。这样,我们就可以使用PersonForm来处理与Person模型相关的表单了。

  1. 渲染表单:在视图函数中,可以使用render()函数将表单渲染到HTML模板中。例如:
from django.shortcuts import render
from .forms import PersonForm

def show_person_form(request):
    form = PersonForm()
    return render(request, 'show_person_form.html', {'form': form})

在这个例子中,我们首先导入了PersonForm类,然后在视图函数show_person_form()中创建了一个PersonForm对象,并将其传递给render()函数以便渲染到show_person_form.html模板中。

  1. 处理表单提交:当用户通过表单提交数据时,可以在视图函数中处理这些数据。例如:
from django.shortcuts import redirect
from .forms import PersonForm

def add_person(request):
    if request.method == 'POST':
        form = PersonForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/')  # 重定向到其他页面或返回HttpResponse对象
    else:
        form = PersonForm()
    return render(request, 'add_person.html', {'form': form})

在这个例子中,我们首先检查请求方法是否为POST。如果是POST请求,则使用request.POST数据创建一个PersonForm对象,并检查其是否有效。如果表单有效,则调用save()方法将数据保存到数据库中,并重定向到其他页面或返回HttpResponse对象。如果请求方法不是POST,则创建一个空的PersonForm对象。

10.request.session 会话

在Django中,request.session是一个字典对象,用于在用户会话之间存储和检索数据。它提供了一种跨多个请求和页面保持状态的方式。

使用request.session,您可以在用户访问网站时存储和检索会话数据。这些数据可以在服务器上持久保存,并且在用户会话之间保持一致。

使用request.session的示例:

  1. 存储数据:
# 在视图函数中
def my_view(request):
    # 存储数据到会话中
    request.session['key'] = 'value'
    # 返回响应
    return HttpResponse('Data stored in session.')
  1. 检索数据:
# 在另一个视图函数中
def another_view(request):
    # 从会话中检索数据
    value = request.session.get('key')
    if value:
        # 如果数据存在,则进行处理
        print(value)
    # 返回响应
    return HttpResponse('Data retrieved from session.')
  1. 删除数据:
# 在视图函数中
def delete_view(request):
    # 从会话中删除数据
    del request.session['key']
    # 返回响应
    return HttpResponse('Data deleted from session.')
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值