Создание информационного блока внутри формы, основанного на полях модели

Я пытаюсь реализовать простой информационный текст на основе поля моей модели, поскольку оно сохраняет некоторые данные, такие как:

MyModel.information:

{
   start_date: imaginary_date,
   end_date: imaginary_date,
   store_name: 'Foo bar'
}

Теперь я хочу отобразить внутри моей административной формы эту информацию в виде текста, например: 'Магазин Foo bar, начало работы в воображаемую_дату и закрытие в воображаемую_дату. Эта реализация нужна только для того, чтобы клиент, который редактирует какую-то информацию на форме, мог легко увидеть информацию о магазине.

Я бы предложил подойти к модели немного по-другому. Вместо того, чтобы хранить часы открытия и закрытия в виде JSON, они могут быть просто полями непосредственно в модели магазина. Работники могут быть JSON-полем [docs], содержащим пары имя/роль. Если вы используете PostgreSQL для своей базы данных, вы можете даже использовать HStoreField [docs], что может быть более подходящим.

Вот как я бы написал подобную модель.

class Store(models.Model):
    name = models.CharField(max_length=512, unique=True)
    workers = models.JSONField(blank=True, default=dict, editable=False)

    closing = models.TimeField(blank=True, null=True, editable=False)
    opening = models.TimeField(blank=True, null=True, editable=False)

Для отображения деталей в админке Django нам просто нужно определить свойство, которое возвращает правильную строку.

    @mark_safe
    def details(self):
        roles = [
            f'{x} has the role: {y}'
            for x, y in self.workers.items()
        ]
        return '<br>'.join([
            f'This store opens at: {self.opening:%-H:%M}',
            f'This store closes at: {self.closing:%-H:%M}',
        ] + roles)

Затем на этот метод можно ссылаться в ModelAdmin и использовать его как поле, доступное только для чтения.

@admin.register(Store)
class StoreAdmin(admin.ModelAdmin):
    list_display = ['name', 'opening', 'closing']
    fields = ['name', 'details']
    readonly_fields = ['details']

Using a method in the Django admin as a read-only field

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