Контекстный процессор для сайта Django
Я создаю создатель свадебного сайта (пожалуйста, не судите).
Почти каждый вид должен вызывать Wedding.objects.get(id=wedding_id)
а затем передать его в шаблон как часть переменных.
Похоже, что это хорошее применение для процессора пользовательских контекстов. Хотите знать, как лучше всего создать контекстный процессор, который будет считывать URL-адрес и, если есть свадебный идентификатор, включите в шаблон объект свадьбы. Если там не было идентификатора свадьбы, тогда wedding= нет в шаблоне.
3 ответа
Во-первых, я хотел бы убедиться, что это действительно нужно практически для каждого запроса, поскольку вы будете кодировать явный запрос для каждого запроса. get
запрос немедленный, а не ленивый filter
, Если вы хотите сделать его более ленивым, вы можете обернуть get в небольшую оболочку get_wedding или использовать filter
и просто взять его из списка...
def add_wedding_context(request):
id_ = request.GET.get('wedding_id', None)
wedding = None
if id_ is not None:
try:
wedding = Wedding.objects.get(id=id_)
except Wedding.DoesNotExist:
pass
return {'wedding':wedding}
Если вы хотите попробовать ленивый подход, чтобы запрос запускался только в том случае, если вы действительно используете объект, вы можете заключить его в ленивый объект:
from django.utils.functional import SimpleLazyObject
from functools import partial
def get_wedd_or_none(id_):
try:
return Wedding.objects.get(id=id_)
except Wedding.DoesNotExist:
return None
def add_wedding_context(request):
id_ = request.GET.get('wedding_id', None)
if id_ is not None:
lazy = SimpleLazyObject(partial(get_wedd_or_none, id_))
return {'wedding': lazy}
else:
return {'wedding': None}
import re
def add_wedding_ring(request):
if re.match('.*/id=.*',request.get_full_path()):
return {'wid':Wedding.objects.get(id=wedding_id)}
return {}
@ Бренден, почему контекстный процессор? Если вы используете Django>=1.3
тогда вы можете просто использовать представление на основе классов, как
class ViewWedding(DetailView):
model = Wedding
pk_url_kwarg = 'wedding_id'
template_name = 'you-template.html'
context_object_name = 'wedding'
Стоит ли иметь еще один контекстный процессор вместо передачи wedding
экземпляр с точки зрения, кстати, я думаю, его более гибкий и предпочтительный способ для context_processor?
Спасибо,
султан