【问题标题】:Django admin site: how to change admin URL based on verbose_nameDjango 管理站点:如何根据 verbose_name 更改管理 URL
【发布时间】:2021-12-19 12:17:08
【问题描述】:

class Meta: verbose_name 仅更改其显示名称。但是当它点击时。我希望它的网址也根据详细名称更改

这是我的代码:

型号:

tables = [f.id for f in StockId.objects.raw(
    "SELECT TABLE_NAME AS id FROM INFORMATION_SCHEMA.tables WHERE TABLE_NAME LIKE 'my_project_auth_stockid%%'")]

table_map = {}
for tbl in tables:
    class Stocks(models.Model):
        user_id = models.IntegerField()
        product_name = models.CharField(max_length=100)
        mrp = models.IntegerField()
        selling_price = models.IntegerField()


        class Meta:
            db_table = tbl
            managed = False
            verbose_name = _(tbl)
            verbose_name_plural = _(tbl)

    table_map[tbl] = Stocks

Admin.py

from my_project_auth.models import *

class AllStocksAdmin(AdminSite):
    site_header = 'All User Stocks'


stockadmin = AllStocksAdmin(name="stockadmin")

for tbl in tables:
    class StocksAdmin(ImportExportModelAdmin):
        resource_class = StocksAdminResource
        list_display = ["product_name"]


    stockadmin.register(table_map[tbl], StocksAdmin)

我要做的是在上面用单个模型制作多个库存表。但是每只股票的管理面板都不起作用。所有股票表都指向单个表,因为管理 URL 基于模型的类名。

我正在尝试在 Admin.py 中执行类似的操作,请提出更改建议:

for tbl in tables:
    class StocksAdmin(ImportExportModelAdmin):
        resource_class = StocksAdminResource
        list_display = ["product_name"]


    def get_urls(self):                                                   # Not Working
        urls = super(StocksAdmin, self).get_urls()

        my_urls = path(f'stockadmin/{tbl}/', self.admin_view(stockadmin))

        return my_urls + urls

【问题讨论】:

  • 这些表有多少?如果您不太喜欢现在的方式,您可以为模型创建唯一名称来解决此问题?
  • @IainShelvington 每个用户都会有自己的股票表。我可以使用当前的代码逻辑,但每个用户都会有自己的表是持久的
  • 您对这个解决方案的设计有意见吗?每个用户都有一张桌子会暴露出越来越多的此类问题。
  • @IainShelvington 该项目的主要逻辑是用户将从“主产品表”中选择产品并拥有自己的库存表(用于他们自己的子域站点)进行销售。是的,会有 1000 个表中的 100 个,但现在因为它处于初始化阶段,有管理面板,它的帮助很大。感谢这个解决方案的人

标签: django django-models django-admin


【解决方案1】:

为了解决多个同名模型的问题,我们可以使用type的三参数形式动态生成具有唯一名称的模型

from django.db import models

tables = [f.id for f in StockId.objects.raw(
    "SELECT TABLE_NAME AS id FROM INFORMATION_SCHEMA.tables WHERE TABLE_NAME LIKE 'my_project_auth_stockid%%'")]


class StockBase(models.Model):
    user_id = models.IntegerField()
    product_name = models.CharField(max_length=100)
    mrp = models.IntegerField()
    selling_price = models.IntegerField()

    class Meta:
        abstract = True


for tbl in tables:
    class Meta:
        db_table = tbl
        managed = False
        verbose_name = tbl
        verbose_name_plural = tbl
    locals()[f'Stocks{tbl}'] = type(f'Stocks{tbl}', (StockBase,), {'Meta': Meta, '__module__': StockBase.__module__})

这将导致多个模型具有相同的字段,来自基类,并且都具有唯一的名称。

我在管理员中使用__subclasses__ 来获取所有创建的模型,但几乎相同,只需注册所有模型即可。

from django.contrib import admin

from . import models


class StocksAdmin(admin.ModelAdmin):
    list_display = ["product_name"]


for cls in models.StockBase.__subclasses__():
    admin.site.register(cls, StocksAdmin)

现在您的管理员应该充满了数十/数百/数千个重复但名称略有不同的模型

【讨论】:

    猜你喜欢
    • 2010-11-01
    • 2019-03-18
    • 2013-06-23
    • 1970-01-01
    • 2016-11-18
    • 2017-12-26
    • 2015-03-21
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多