小白IT:Django框架—admin详细使用

本文详述了Django框架中admin模块的使用,从面向对象的复习开始,介绍了admin的使用流程、路由系统和文件加载。重点讲解了如何自定义admin界面,包括数据表的准备、路由配置、应用注册、界面汉化以及记录列表的多项设置,如list_display、list_filter等,帮助开发者实现更丰富的admin功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Django框架—admin详细使用

一、面向对象复习

1.类的继承

`class` `Base(``object``): ``# 定义类Base``  ``def` `__init__(``self``,val):``    ``self``.val ``=` `val``````def` `func(``self``):``    ``self``.test()``    ``print``(``self``.val)``````def` `test(``self``):``    ``print``(``"Base.test"``)````class` `Foo(Base): ``# 定义类Foo``  ``def` `test(``self``):``    ``print``(``"FOO.test"``)``````# def func(self):``  ``#   print(self.val,666)``  ``# 有就执行自己的,没有就执行父类的``class` `Bar(``object``):``  ``def` `__init__(``self``):``    ``self``._register ``=` `{}``````def` `register(``self``,a,b``=``None``):``    ``if` `not` `b:``      ``b``=``Base``    ``self``._register[a] ``=` `b(a) ``#函数,类,对象````obj ``=` `Bar() ``#实例化就会去执行它自己的__init__方法,并获取到一个对象b,b就可以调用里面的属性和方法了````obj.register(``1``,Foo) ``# _register属性中存的是1:Foo类,且Foo.val=1``obj.register(``2``) ``# 又增加了一个2:Base类的实例,且Base.val=2``print``(obj._register) ``# {1: <__main__.Foo object at 0x0000000002213160>, 2: <__main__.Base object at 0x0000000002213198>}``# obj._register[1] == Foo(1)````obj._register[``1``].func() ``# Foo的对象 打印结果:FOO.test   1``obj._register[``2``].func() ``# Base的对象 打印结果:Base.test   2`

2.单例模式

单例模式是一个设计模式(说白了就是单个实例公用一个对象)

举例一

s1.py

`class` `Foo(``object``):``  ``def` `test(``self``):``    ``print``(``"123"``)````v ``=` `Foo()``# v是Foo的实例`

s2.py


# [Django框架—admin详细使用](https://www.cnblogs.com/ryxiong-blog/articles/11067035.html)

# 一、面向对象复习

## 1.类的继承

```python
`class` `Base(``object``): ``# 定义类Base``  ``def` `__init__(``self``,val):``    ``self``.val ``=` `val``````def` `func(``self``):``    ``self``.test()``    ``print``(``self``.val)``````def` `test(``self``):``    ``print``(``"Base.test"``)````class` `Foo(Base): ``# 定义类Foo``  ``def` `test(``self``):``    ``print``(``"FOO.test"``)``````# def func(self):``  ``#   print(self.val,666)``  ``# 有就执行自己的,没有就执行父类的``class` `Bar(``object``):``  ``def` `__init__(``self``):``    ``self``._register ``=` `{}``````def` `register(``self``,a,b``=``None``):``    ``if` `not` `b:``      ``b``=``Base``    ``self``._register[a] ``=` `b(a) ``#函数,类,对象````obj ``=` `Bar() ``#实例化就会去执行它自己的__init__方法,并获取到一个对象b,b就可以调用里面的属性和方法了````obj.register(``1``,Foo) ``# _register属性中存的是1:Foo类,且Foo.val=1``obj.register(``2``) ``# 又增加了一个2:Base类的实例,且Base.val=2``print``(obj._register) ``# {1: <__main__.Foo object at 0x0000000002213160>, 2: <__main__.Base object at 0x0000000002213198>}``# obj._register[1] == Foo(1)````obj._register[``1``].func() ``# Foo的对象 打印结果:FOO.test   1``obj._register[``2``].func() ``# Base的对象 打印结果:Base.test   2`

2.单例模式

单例模式是一个设计模式(说白了就是单个实例公用一个对象)

举例一

s1.py

`class` `Foo(``object``):``  ``def` `test(``self``):``    ``print``(``"123"``)````v ``=` `Foo()``# v是Foo的实例`

s2.py

`from` `s1 ``import` `v as v1``print``(v1,``id``(v1)) ``#  35788560````from` `s1 ``import` `v as v2``print``(v1,``id``(v2))  ``#  35788560````# 两个的内存地址是一样的`

注意:文件加载的时候,第一次导入后,再次导入时不会再重新加载。

举例二
`class` `Singleton:``  ``def` `__new__(``cls``, ``*``args, ``*``*``kw):``    ``'''__new__是一个构造方法,self就是他构造的'''``    ``if` `not` `hasattr``(``cls``, ``'_instance'``):``      ``orig ``=` `super``(Singleton, ``cls``)``      ``cls``._instance ``=` `orig.__new__(``cls``, ``*``args, ``*``*``kw)``    ``return` `cls``._instance````one ``=` `Singleton()``two ``=` `Singleton()``print``(one,two)  ``# 他们两个的地址一样``# print(id(one),id(two))``one.name ``=` `'alex'``print``(two.name)`

二、django-admin的简单回顾

1.admin使用流程

models.py

  • 创建表模型

admin.py

  • 注册表 admin.site.register(models.UserInfo)

urls.py

url(r'^admin/', admin.site.urls),

注意:

  1. 动态生成url
  2. 注册和生成url使用的都是admin.site
2.路由系统

一个路径对应一个视图

url(r'^index/$', views.index,name="index1"), 
url(r'^index/(\d+)$', views.index,name="index2"),
url(r'^blog/', include('blog.urls'))

有name的说明是反向解析,两种方式

代码中:

reverse('index1')
reverse('index2',args=(666,))

模板中:

{% url 'index1' %}
{% url 'index2' 666 %}
3.文件加载

第一次导入后,再次导入时不再重新加载

4.面向对象
  • 封装
  • 继承

三、django-admin的具体使用

https://www.cnblogs.com/wumingxiaoyao/p/6928297.html

首先需要发现的,当我们创建登录admin的时候,里面会有增删改查,但是admin的功能远不止这些,我们可以通过以下方式设置admin的表样式,以及扩展admin的功能。

1.数据表的准备

新建admin学习项目,应用admin_lesson,models文件中

from django.db import models
class UserInfo(models.Model):
    name = models.CharField(max_length=32,verbose_name="用户名")
    email = models.EmailField(max_length=32,verbose_name="邮箱")
    ut = models.ForeignKey(to="UserType",verbose_name="所属类型")
    def __str__(self):
        return self.name


class UserType(models.Model):
    caption = models.CharField(max_length=32,verbose_name="用户类型名称")
    roles = models.ManyToManyField(to="Role",verbose_name="所属角色")
    
    def __str__(self):
        return self.caption

class Role(models.Model):
    name = models.CharField(max_length=32,verbose_name="角色名")
    
    def __str__(self):
        return self.name

同步数据库

`# 项目路径下cmd中``python manage.py makemigrations``python manage.py migrate``python manage.py createsuperuser ``# 创建控制admin的用户,只需要填用户名密码,邮箱可以忽略`

或者使用django的自带环境,可以省略python admin

2.配置路由

项目路径下

urlpatterns = [
        url(r'^admin/', admin.site.urls),
    ]

admin路由可以创建一些路由映射关系

`/``admin``/``/``admin``/``login``/``/``admin``/``logout``/``/``admin``/``password_change``/``/``admin``/``password_change``/``done``/````/``admin``/``app名称``/``model名称``/``/``admin``/``app名称``/``model名称``/``add``/``/``admin``/``app名称``/``model名称``/``ID``值``/``history``/``/``admin``/``app名称``/``model名称``/``ID``值``/``change``/``/``admin``/``app名称``/``model名称``/``ID``值``/``delete``/`
实例
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^admin/admin_lesson/userinfo/1/change', admin.site.urls),  # 配置修改userinfo表id为1的记录路径
]

3.应用注册

普通注册方法

`admin.site.register(models.UserInfo)``admin.site.register(models.Role)``admin.site.register(models.UserType)`

这种注册方法,可以在admin中对表进行增删改查的基本功能,但是如果我们需要在admin中实现更多个性化的功能定制,就需要利用ModelAdmin操作。

自定义注册应用

若要把app应用显示在后台管理中,需要在admin.py中注册。这个注册有两种方式,个人比较喜欢用装饰器的方式。

方式1
`from` `django.contrib ``import` `admin``from` `admin_lesson.models ``import` `UserInfo`` ` `# Userinfo模型的管理器``class` `UserInfoAdmin(admin.ModelAdmin):``  ``list_display``=``(``'id'``, ``'name'``, ``'email'``, ``'ut'``)``   ` `# 在admin中注册绑定``admin.site.register(UserInfo, UserInfoAdmin)`

上面方法是将管理器和注册语句分开。有时容易忘记写注册语句,或者模型很多,不容易对应。

方式2
`from` `django.contrib ``import` `admin``from` `admin_lesson.models ``import` `UserInfo`` ` `#Blog模型的管理器``@admin``.register(Userinfo)``class` `UserInfoAdmin(admin.ModelAdmin):``  ``list_display``=``(``'id'``, ``'name'``, ``'email'``, ``'ut'``)`

该方式比较方便明显,推荐用这种方式。

4.admin界面汉化

默认admin后台管理界面是英文的,对英语盲来说用起来不方便。可以在settings.py中设置改为:

`LANGUAGE_CODE ``=` `'zh-CN'``TIME_ZONE ``=` `'Asia/Shanghai'`

1.8版本之后的language code设置不同:

`LANGUAGE_CODE ``=` `'zh-hans'``TIME_ZONE ``=` `'Asia/Shanghai'`

注意注释掉原有设置

img

5.记录列表基本设置

1.list_display

列表显示时,定制显示的列。

`@admin``.register(models.UserInfo)``class` `UserAdmin(admin.ModelAdmin):``  ``list_display ``=` `(``'id'``, ``'name'``, ``'email'``, ``'ut'``, ``'show'``)`` ` `  ``def` `show(``self``, obj): ``# 定义一个函数显示的字段``    ``return` `"1234"`
2.list_display_links

列表显示时,定制列可以点击跳转到详细记录进行修改。

`class` `UserInfoAdmin(admin.ModelAdmin):``  ``list_display ``=` `(``'id'``, ``'name'``, ``'email'``, ``'ut'``, ``'show'``)``  ``list_display_links ``=` `(``'name'``,)``````def` `show(``self``, obj): ``# 定义一个函数显示的字段``    ``return` `"1234"`

img

3.list_filter

定制右侧快速筛选。

`class` `UserInfoAdmin(admin.ModelAdmin):``  ``list_display ``=` `(``'id'``, ``'name'``, ``'email'``, ``'ut'``, ``'show'``)``  ``list_display_links ``=` `(``'name'``,)``````def` `show(``self``, obj):``    ``return` `"1234"``````class` `Ugg(admin.SimpleListFilter):``    ``title ``=` `_(``"邮箱"``) ``# 显示已什么筛选``    ``parameter_name ``=` `"show"``````def` `lookups(``self``, request, model_admin):``      ``"""``      ``显示筛选选项``      ``:param request:``      ``:param model_admin:``      ``:return:``      ``"""``      ``return` `models.UserInfo.objects.values_list(``'id'``, ``'email'``)``````def` `queryset(``self``, request, queryset):``      ``"""``      ``点击查询时,进行筛选``      ``:param request:``      ``:param queryset:``      ``:return:``      ``"""``      ``val ``=` `self``.value()``      ``return` `queryset.``filter``(email``=``val)``````list_filter ``=` `(``"name"``,Ugg)`

img

4.分页相关
`# 分页,每页显示条数``  ``list_per_page ``=` `100`` ` `# 分页,显示全部(真实数据<该值时,才会有显示全部)``  ``list_max_show_all ``=` `200`` ` `# 分页插件``  ``paginator ``=` `Paginator`
5.search_field

模糊搜索的功能

`search_fields ``=` `[``"name"``,``"email"``]`
6.其他基本设置
`# ordering设置默认排序字段,负号表示降序排序``ordering ``=` `(``'-id'``,)````# list_editable 设置默认可编辑字段``list_editable ``=` `[``'email'``, ``'ut'``]````# fk_fields 设置显示外键字段``fk_fields ``=` `(``'ut'``,)`
7.date_hierarchy

列表时,对Date和DateTime类型进行搜索

`@admin``.register(models.UserInfo)``class` `UserAdmin(admin.ModelAdmin):`` ` `  ``date_hierarchy ``=` `'ctime'`
8.preserve_filters,

详细页面,删除、修改,更新后跳转回列表后,是否保留原搜索条件

9.save_as = False

详细页面,按钮为“Sava as new” 或 “Sava and add another”

10.save_as_continue = True

点击保存并继续编辑

`save_as_continue ``=` `True`` ` `# 如果 save_as=True,save_as_continue = True, 点击Sava as new 按钮后继续编辑。``# 如果 save_as=True,save_as_continue = False,点击Sava as new 按钮后返回列表。`

save_on_top = False,详细页面,在页面上方是否也显示保存删除等按钮

11.inlines

详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除

`class` `UserInfoInline(admin.StackedInline): ``# TabularInline``  ``extra ``=` `0``  ``model ``=` `models.UserInfo`` ` ` ` `class` `GroupAdminMode(admin.ModelAdmin):``  ``list_display ``=` `(``'id'``, ``'title'``,)``  ``inlines ``=` `[UserInfoInline, ]`
12.action

列表时,定制action中的操作

`@admin``.register(models.UserInfo)``class` `UserAdmin(admin.ModelAdmin):`` ` `  ``# 定制Action行为具体方法``  ``def` `func(``self``, request, queryset):``    ``print``(``self``, request, queryset)``    ``print``(request.POST.getlist(``'_selected_action'``))`` ` `  ``func.short_description ``=` `"中文显示自定义Actions"``  ``actions ``=` `[func, ]`` ` `  ``# Action选项都是在页面上方显示``  ``actions_on_top ``=` `True``  ``# Action选项都是在页面下方显示``  ``actions_on_bottom ``=` `False`` ` `  ``# 是否显示选择个数``  ``actions_selection_counter ``=` `True`

from s1 ``import v as v1``print``(v1,``id``(v1)) ``# 35788560````from s1 ``import v as v2``print``(v1,``id``(v2)) ``# 35788560````# 两个的内存地址是一样的


注意:文件加载的时候,第一次导入后,再次导入时不会再重新加载。

#### 举例二

```python
`class` `Singleton:``  ``def` `__new__(``cls``, ``*``args, ``*``*``kw):``    ``'''__new__是一个构造方法,self就是他构造的'''``    ``if` `not` `hasattr``(``cls``, ``'_instance'``):``      ``orig ``=` `super``(Singleton, ``cls``)``      ``cls``._instance ``=` `orig.__new__(``cls``, ``*``args, ``*``*``kw)``    ``return` `cls``._instance````one ``=` `Singleton()``two ``=` `Singleton()``print``(one,two)  ``# 他们两个的地址一样``# print(id(one),id(two))``one.name ``=` `'alex'``print``(two.name)`

二、django-admin的简单回顾

1.admin使用流程

models.py

  • 创建表模型

admin.py

  • 注册表 admin.site.register(models.UserInfo)

urls.py

url(r'^admin/', admin.site.urls),

注意:

  1. 动态生成url
  2. 注册和生成url使用的都是admin.site
2.路由系统

一个路径对应一个视图

url(r'^index/$', views.index,name="index1"), 
url(r'^index/(\d+)$', views.index,name="index2"),
url(r'^blog/', include('blog.urls'))

有name的说明是反向解析,两种方式

代码中:

reverse('index1')
reverse('index2',args=(666,))

模板中:

{% url 'index1' %}
{% url 'index2' 666 %}
3.文件加载

第一次导入后,再次导入时不再重新加载

4.面向对象
  • 封装
  • 继承

三、django-admin的具体使用

https://www.cnblogs.com/wumingxiaoyao/p/6928297.html

首先需要发现的,当我们创建登录admin的时候,里面会有增删改查,但是admin的功能远不止这些,我们可以通过以下方式设置admin的表样式,以及扩展admin的功能。

1.数据表的准备

新建admin学习项目,应用admin_lesson,models文件中

from django.db import models
class UserInfo(models.Model):
    name = models.CharField(max_length=32,verbose_name="用户名")
    email = models.EmailField(max_length=32,verbose_name="邮箱")
    ut = models.ForeignKey(to="UserType",verbose_name="所属类型")
    def __str__(self):
        return self.name


class UserType(models.Model):
    caption = models.CharField(max_length=32,verbose_name="用户类型名称")
    roles = models.ManyToManyField(to="Role",verbose_name="所属角色")
    
    def __str__(self):
        return self.caption

class Role(models.Model):
    name = models.CharField(max_length=32,verbose_name="角色名")
    
    def __str__(self):
        return self.name

同步数据库

`# 项目路径下cmd中``python manage.py makemigrations``python manage.py migrate``python manage.py createsuperuser ``# 创建控制admin的用户,只需要填用户名密码,邮箱可以忽略`

或者使用django的自带环境,可以省略python admin

2.配置路由

项目路径下

urlpatterns = [
        url(r'^admin/', admin.site.urls),
    ]

admin路由可以创建一些路由映射关系

`/``admin``/``/``admin``/``login``/``/``admin``/``logout``/``/``admin``/``password_change``/``/``admin``/``password_change``/``done``/````/``admin``/``app名称``/``model名称``/``/``admin``/``app名称``/``model名称``/``add``/``/``admin``/``app名称``/``model名称``/``ID``值``/``history``/``/``admin``/``app名称``/``model名称``/``ID``值``/``change``/``/``admin``/``app名称``/``model名称``/``ID``值``/``delete``/`
实例
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^admin/admin_lesson/userinfo/1/change', admin.site.urls),  # 配置修改userinfo表id为1的记录路径
]

3.应用注册

普通注册方法

`admin.site.register(models.UserInfo)``admin.site.register(models.Role)``admin.site.register(models.UserType)`

这种注册方法,可以在admin中对表进行增删改查的基本功能,但是如果我们需要在admin中实现更多个性化的功能定制,就需要利用ModelAdmin操作。

自定义注册应用

若要把app应用显示在后台管理中,需要在admin.py中注册。这个注册有两种方式,个人比较喜欢用装饰器的方式。

方式1
`from` `django.contrib ``import` `admin``from` `admin_lesson.models ``import` `UserInfo`` ` `# Userinfo模型的管理器``class` `UserInfoAdmin(admin.ModelAdmin):``  ``list_display``=``(``'id'``, ``'name'``, ``'email'``, ``'ut'``)``   ` `# 在admin中注册绑定``admin.site.register(UserInfo, UserInfoAdmin)`

上面方法是将管理器和注册语句分开。有时容易忘记写注册语句,或者模型很多,不容易对应。

方式2
`from` `django.contrib ``import` `admin``from` `admin_lesson.models ``import` `UserInfo`` ` `#Blog模型的管理器``@admin``.register(Userinfo)``class` `UserInfoAdmin(admin.ModelAdmin):``  ``list_display``=``(``'id'``, ``'name'``, ``'email'``, ``'ut'``)`

该方式比较方便明显,推荐用这种方式。

4.admin界面汉化

默认admin后台管理界面是英文的,对英语盲来说用起来不方便。可以在settings.py中设置改为:

`LANGUAGE_CODE ``=` `'zh-CN'``TIME_ZONE ``=` `'Asia/Shanghai'`

1.8版本之后的language code设置不同:

`LANGUAGE_CODE ``=` `'zh-hans'``TIME_ZONE ``=` `'Asia/Shanghai'`

注意注释掉原有设置

img

5.记录列表基本设置

1.list_display

列表显示时,定制显示的列。

`@admin``.register(models.UserInfo)``class` `UserAdmin(admin.ModelAdmin):``  ``list_display ``=` `(``'id'``, ``'name'``, ``'email'``, ``'ut'``, ``'show'``)`` ` `  ``def` `show(``self``, obj): ``# 定义一个函数显示的字段``    ``return` `"1234"`
2.list_display_links

列表显示时,定制列可以点击跳转到详细记录进行修改。

`class` `UserInfoAdmin(admin.ModelAdmin):``  ``list_display ``=` `(``'id'``, ``'name'``, ``'email'``, ``'ut'``, ``'show'``)``  ``list_display_links ``=` `(``'name'``,)``````def` `show(``self``, obj): ``# 定义一个函数显示的字段``    ``return` `"1234"`

img

3.list_filter

定制右侧快速筛选。

`class` `UserInfoAdmin(admin.ModelAdmin):``  ``list_display ``=` `(``'id'``, ``'name'``, ``'email'``, ``'ut'``, ``'show'``)``  ``list_display_links ``=` `(``'name'``,)``````def` `show(``self``, obj):``    ``return` `"1234"``````class` `Ugg(admin.SimpleListFilter):``    ``title ``=` `_(``"邮箱"``) ``# 显示已什么筛选``    ``parameter_name ``=` `"show"``````def` `lookups(``self``, request, model_admin):``      ``"""``      ``显示筛选选项``      ``:param request:``      ``:param model_admin:``      ``:return:``      ``"""``      ``return` `models.UserInfo.objects.values_list(``'id'``, ``'email'``)``````def` `queryset(``self``, request, queryset):``      ``"""``      ``点击查询时,进行筛选``      ``:param request:``      ``:param queryset:``      ``:return:``      ``"""``      ``val ``=` `self``.value()``      ``return` `queryset.``filter``(email``=``val)``````list_filter ``=` `(``"name"``,Ugg)`

img

4.分页相关
`# 分页,每页显示条数``  ``list_per_page ``=` `100`` ` `# 分页,显示全部(真实数据<该值时,才会有显示全部)``  ``list_max_show_all ``=` `200`` ` `# 分页插件``  ``paginator ``=` `Paginator`
5.search_field

模糊搜索的功能

`search_fields ``=` `[``"name"``,``"email"``]`
6.其他基本设置
`# ordering设置默认排序字段,负号表示降序排序``ordering ``=` `(``'-id'``,)````# list_editable 设置默认可编辑字段``list_editable ``=` `[``'email'``, ``'ut'``]````# fk_fields 设置显示外键字段``fk_fields ``=` `(``'ut'``,)`
7.date_hierarchy

列表时,对Date和DateTime类型进行搜索

`@admin``.register(models.UserInfo)``class` `UserAdmin(admin.ModelAdmin):`` ` `  ``date_hierarchy ``=` `'ctime'`
8.preserve_filters,

详细页面,删除、修改,更新后跳转回列表后,是否保留原搜索条件

9.save_as = False

详细页面,按钮为“Sava as new” 或 “Sava and add another”

10.save_as_continue = True

点击保存并继续编辑

`save_as_continue ``=` `True`` ` `# 如果 save_as=True,save_as_continue = True, 点击Sava as new 按钮后继续编辑。``# 如果 save_as=True,save_as_continue = False,点击Sava as new 按钮后返回列表。`

save_on_top = False,详细页面,在页面上方是否也显示保存删除等按钮

11.inlines

详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除

`class` `UserInfoInline(admin.StackedInline): ``# TabularInline``  ``extra ``=` `0``  ``model ``=` `models.UserInfo`` ` ` ` `class` `GroupAdminMode(admin.ModelAdmin):``  ``list_display ``=` `(``'id'``, ``'title'``,)``  ``inlines ``=` `[UserInfoInline, ]`
12.action

列表时,定制action中的操作

`@admin``.register(models.UserInfo)``class` `UserAdmin(admin.ModelAdmin):`` ` `  ``# 定制Action行为具体方法``  ``def` `func(``self``, request, queryset):``    ``print``(``self``, request, queryset)``    ``print``(request.POST.getlist(``'_selected_action'``))`` ` `  ``func.short_description ``=` `"中文显示自定义Actions"``  ``actions ``=` `[func, ]`` ` `  ``# Action选项都是在页面上方显示``  ``actions_on_top ``=` `True``  ``# Action选项都是在页面下方显示``  ``actions_on_bottom ``=` `False`` ` `  ``# 是否显示选择个数``  ``actions_selection_counter ``=` `True`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值