Контекстный процессор для сайта 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?

Спасибо,

султан

Другие вопросы по тегам