Создание информационного блока внутри формы, основанного на полях модели
Я пытаюсь реализовать простой информационный текст на основе поля моей модели, поскольку оно сохраняет некоторые данные, такие как:
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']