📜  在字段中自定义 django admin 编辑模型按钮 - Python (1)

📅  最后修改于: 2023-12-03 15:23:32.240000             🧑  作者: Mango

在字段中自定义 Django Admin 编辑模型按钮 - Python

在 Django Admin 中,我们可以轻松地创建一个模型实例管理界面。但是,有些时候,我们可能想添加一些自定义按钮来扩展 Django Admin 的功能。在本文中,我们将介绍如何在字段中自定义 Django Admin 编辑模型按钮。

前提条件

在开始本教程之前,你应该已经了解模型管理器、模型和 Django Admin 路由器的概念。如果你还没有接触过这些内容,建议先学习它们。

创建模型

假设我们要管理一个名为 Person 的模型,我们可以在 models.py 中创建它:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
自定义按钮

要在 Django Admin 中添加自定义编辑按钮,我们需要在 admin.py 中注册该模型,并定义一个自定义 ModelAdmin 类。在该类中,我们可以使用 list_display 属性添加我们想要显示的字段,并使用 list_editable 属性添加我们想要编辑的字段。

但是,在本教程中,我们将详细介绍如何在字段中自定义按钮。我们可以使用 django.urls.reverse 来创建自定义 URL,并在每个字段中添加一个自定义按钮。

首先,在 admin.py 中导入 reverse 函数和 HttpResponseRedirect 类:

from django.urls import reverse
from django.http import HttpResponseRedirect

接下来,我们需要定义一个带有 request 参数的自定义方法。在该方法中,我们可以获取当前模型实例的 ID 和字段值,并使用 reverse 函数创建自定义 URL。最后,我们使用 HttpResponseRedirect 类重定向到自定义 URL。

def custom_edit(obj):
    url = reverse('admin:custom_edit', args=[obj.id, obj.age])
    return '<a href="%s">Edit</a>' % url
custom_edit.short_description = 'Custom Edit'

在以上示例中,我们定义了一个名为 custom_edit 的方法,它接收一个参数 obj,表示当前模型实例。我们使用 reverse 函数创建一个名为 admin:custom_edit 的自定义 URL,其中 obj.id 表示当前模型实例的 ID,obj.age 表示当前模型实例的年龄值。最后,我们使用 <a> 标签将链接包装起来,并返回一个字符串。

接下来,我们需要将 custom_edit 方法添加到 list_display 属性中。我们可以使用 short_description 属性为自定义按钮添加一个短描述。

class PersonAdmin(admin.ModelAdmin):
    list_display = ('name', 'age', custom_edit',)
    # ...

最后,我们需要为自定义 URL 添加一个视图函数。我们可以在 urls.py 文件中定义一个 URL,并指定它所属的视图函数:

from django.urls import path
from .views import custom_edit_view

urlpatterns = [
    path('custom_edit/<int:pk>/<int:age>/', custom_edit_view, name='custom_edit'),
    # ...
]

在以上示例中,我们定义了一个名为 custom_edit_view 的视图函数,并指定它所属的 URL 为 custom_edit/<int:pk>/<int:age>/。其中,<int:pk> 表示模型实例的 ID,<int:age> 表示模型实例的年龄值。

最后,在 views.py 文件中定义 custom_edit_view 视图函数:

from django.shortcuts import render

def custom_edit_view(request, pk, age):
    # 获取模型实例
    person = Person.objects.get(pk=pk)
    # 更新模型
    person.age = age * 2
    person.save()
    # 重定向到模型管理器页面
    return HttpResponseRedirect(reverse('admin:myapp_person_changelist'))

在以上示例中,我们获取模型实例、更新模型、保存模型,并使用 reverse 函数重定向到模型管理器页面。

我们已经成功地添加了一个自定义编辑按钮。当我们单击按钮时,将打开一个自定义 URL,它将获取模型实例的 ID 和字段值,并更新模型。最后,它将重定向到模型管理器页面。

结论

在本文中,我们介绍了如何在字段中自定义 Django Admin 编辑模型按钮。我们使用 django.urls.reverse 函数创建自定义 URL,并在每个字段中添加一个自定义按钮。最后,我们为自定义 URL 添加一个视图函数,并完成模型的更新操作。