Администрирование сайта Django: как изменить URL-адрес администратора на основе verbose_name

class Meta: verbose_name изменяет только отображаемое имя. Но когда он щелкнут. Я хочу, чтобы его url тоже изменился на основе расширенного имени

Вот мой код:

Модели:

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

Для решения проблемы наличия нескольких моделей с одинаковыми именами мы можем генерировать их динамически с уникальными именами, используя форму с тремя аргументами 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)

Теперь ваш администратор должен быть полон десятков/сотен/тысяч дубликатов, но названных немного по-другому моделей

Вернуться на верх