繁体   English   中英

为现有应用定制 django 管理页面的最佳方法

[英]Best approach to customize django admin page for existing app

我目前正在通过尝试为以下应用程序实现管理页面来学习 django 的一些基础知识: PowerGSLB

虽然它已经有了基于 W2UI 的漂亮 UI,但我的目标是学习 django 并在 django 管理模块的帮助下进行基于角色的身份验证。 但这实际上不是问题的重点。

我一直坚持向用户展示 DNS 记录的基本列表。 DB model 看起来像这样:

db_model_image

因此,我运行了inspectdb并基于此结构创建了模型。 毕竟,我的记录model 看起来像这样:

class Records(models.Model):
    id = models.BigAutoField(primary_key=True)
    name_type = models.ForeignKey(NamesTypes, models.DO_NOTHING)
    content_monitor = models.ForeignKey(ContentsMonitors, models.DO_NOTHING)
    view = models.ForeignKey('Views', models.DO_NOTHING)
    disabled = models.BigIntegerField()
    fallback = models.BigIntegerField()
    weight = models.BigIntegerField()

    def __str__(self):
        return f"{self.name_type} {self.content_monitor} {self.disabled} {self.fallback} {self.weight}"

    def get_all(self, in_var):
        self.result = dict()

        # Objects to get results from
        self.name_type_obj = NamesTypes.objects.get(id=self.name_type_id)
        self.content_monitor_obj = ContentsMonitors.objects.get(id=self.content_monitor_id)
        self.view_obj = Views.objects.get(id=self.view_id)
        self.names_obj = Names.objects.get(id=self.name_type_obj.name_id)
        self.domain_obj = Domains.objects.get(id=self.names_obj.domain_id)
        self.contents_obj = Contents.objects.get(id=self.content_monitor_obj.content_id)
        self.monitor_obj = Monitors.objects.get(id=self.content_monitor_obj.monitor_id)
        self.types_obj = Types.objects.get(value=self.name_type_obj.type_value_id)

        # Result vars
        self.result['domain'] = self.domain_obj.domain
        self.result['name'] = self.names_obj.name
        self.result['type'] = self.types_obj.type
        self.result['content'] = self.contents_obj.content
        self.result['ttl'] = self.name_type_obj.ttl
        self.result['id'] = self.id
        self.result['disabled'] = self.disabled
        self.result['fallback'] = self.fallback
        self.result['persistence'] = self.name_type_obj.persistence
        self.result['weight'] = self.weight
        self.result['monitor'] = self.monitor_obj.monitor
        self.result['view'] = self.view_obj.rule

        return self.result[in_var]

我的应用程序的 admin.py 如下所示:

from django.contrib import admin

from .models import Records


@admin.register(Records)
class RecordsAdmin(admin.ModelAdmin):
    list_display = (
        'get_domain',
        'get_name',
        'get_type',
        'get_content',
        'get_ttl',
        'get_disabled',
        'get_fallback',
        'get_persistence',
        'get_weight',
        'get_monitor',
        'get_view',
    )

    def get_domain(self, obj):
        return obj.get_all('domain')

    def get_name(self, obj):
        return obj.get_all('name')

    def get_type(self, obj):
        return obj.get_all('type')

    def get_content(self, obj):
        return obj.get_all('content')

    def get_ttl(self, obj):
        return obj.get_all('ttl')

    def get_disabled(self, obj):
        return obj.get_all('disabled')

    def get_fallback(self, obj):
        return obj.get_all('fallback')

    def get_persistence(self, obj):
        return obj.get_all('persistence')

    def get_weight(self, obj):
        return obj.get_all('weight')

    def get_monitor(self, obj):
        return obj.get_all('monitor')

    def get_view(self, obj):
        return obj.get_all('view')

    get_domain.short_description = "Domain"
    get_name.short_description = "Name"
    get_type.short_description = "Type"
    get_content.short_description = "Content"
    get_ttl.short_description = "TTL"
    get_disabled.short_description = "Disabled"
    get_fallback.short_description = "Fallback"
    get_persistence.short_description = "Persistence"
    get_weight.short_description = "Weight"
    get_monitor.short_description = "Monitor"
    get_view.short_description = "View"

它实际上可以工作(这是一个图像gslb_example ),但与原始 UI 相比,它非常慢。 显然这是因为我对数据库有很多查询,而不是一个大查询,这是一个问题 - 在 django 管理员中执行此操作的最佳方法是什么?

我正在使用 django v.3.1.4

也许你可以修改 get_all(self, in_var) 方法

并且可以这样做

def get_all(self, in_var):
    self.result = dict()
    if in_var == "domain":
        return Domains.objects.get(id=self.names_obj.domain_id)
        

如果你愿意,你可以 map in_var 到 model 类,同样你可以使用其他变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM