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