Я работаю над проектом django, который требует, чтобы большая часть общих данных страницы была динамичной. Вещи, которые появляются на каждой странице, такие как номер телефона, адрес, адрес электронной почты основного контактного лица и т. Д., Должны быть доступны для редактирования через панель администратора, поэтому их сохранение в файле settings.py не будет работать.
Чтобы обойти это, я создал пользовательский контекстный процессор, который действует как абстрактная ссылка на мою модель «Live Settings». Модель выглядит так:
class LiveSetting(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=255, blank=False, null=False)
description = models.TextField(blank=True, null=True)
key = models.CharField(max_length=100, blank=False, null=False)
value = models.CharField(max_length=255, blank=True)
А контекстный процессор вот так:
from livesettings.models import LiveSetting
class LiveSettingsProcessor(object):
def __getattr__(self, request):
val = LiveSetting.objects.get(request)
setattr(self, val.key, val.value)
return val.value
l = LiveSettingsProcessor()
def livesetting_processors(request):
return {'settings':l}
Это работает очень хорошо, и в моем шаблоне я могу использовать {{settings.primary_email}} и получить соответствующее значение из базы данных.
Проблема с приведенным выше кодом заключается в том, что он обрабатывает каждый живой запрос настроек отдельно и будет попадать в базу данных каждый раз, когда мой тег {{settings. *}} Используется в шаблоне.
У кого-нибудь есть идеи, если бы я мог сделать этот процесс ленивым, поэтому вместо того, чтобы извлекать значение и возвращать его, он вместо этого обновляет QuerySet, а затем возвращает результаты одним попаданием непосредственно перед визуализацией страницы?