Форматирование встроенных моделей «многие ко многим», представленных в django admin - PullRequest
4 голосов
/ 26 мая 2010

У меня есть две модели django (упрощенно):

class Product(models.Model):
    name  = models.TextField()
    price = models.IntegerField()

class Invoice(models.Model):
    company  = models.TextField()
    customer = models.TextField()
    products = models.ManyToManyField(Product)

Я хотел бы видеть релевантные продукты в виде удобной таблицы (полей продуктов) на странице счетов-фактур в admin и иметь возможность ссылаться на отдельные соответствующие страницы продуктов.

Моей первой мыслью было использование встроенной функции администратора, но django использовал виджет для каждого выбранного продукта. Это не связано со страницами продукта, а также, поскольку у меня есть тысячи продуктов, и каждое поле выбора независимо загружает все названия продуктов, оно быстро становится неоправданно медленным.

Итак, я перешел к использованию ModelAdmin.filter_horizontal, как предлагалось здесь , в котором использовался один экземпляр другого виджета, где у вас есть список всех продуктов и другой список связанных продуктов, и вы можете добавить \ убрать продукты в последнем от первого. Это решило медлительность, но все равно не отображает соответствующие поля Product и не может быть связано.

Итак, что мне делать? настроить вид? переопределить ModelForms? Я погуглил и не смог найти ни одного примера такого кода ...

Ответы [ 2 ]

0 голосов
/ 06 декабря 2016

Это старый вопрос, но я связался с ним сегодня.

Вы можете найти ответ здесь - https://blog.ionelmc.ro/2012/01/19/tweaks-for-making-django-admin-faster/

Код:

class MyAdmin(admin.TabularInline):
    fields = 'myfield',
    def formfield_for_dbfield(self, db_field, **kwargs):
        formfield = super(MyAdmin, self).formfield_for_dbfield(db_field, **kwargs)
        if db_field.name == 'myfield':
            # dirty trick so queryset is evaluated and cached in .choices
            formfield.choices = formfield.choices
        return formfield

Это может сократить время ожидания с 5 минут до 15 секунд.

0 голосов
/ 26 мая 2010

Возможно, это не то, что вы ожидаете, но я бы представил модель InvoiceItem, которая бы связывала Invoice с Product. Таким образом, вы бы имели 2x 1: n вместо отношения m: n. Затем используйте встроенную настраиваемую форму для InvoiceItem и raw_id_fields в этой форме для выбора продукта.

В форме InvoiceItem вы можете добавить поля только для чтения, которые будут отображать значения, которые вам нужно отобразить. Вам нужно будет предоставить данные для этих полей в форме init , читая их из экземпляра InvoiceItem. Или вы также можете получить из виджета raw_id_field и в методе рендеринга этого виджета добавить некоторые дополнительные данные из модели продукта?

...