Django站点的上下文处理器

时间:2012-07-31 03:11:39

标签: python django django-context

我正在建立一个婚礼网站创建者(请不要判断)。

几乎每个视图都需要调用Wedding.objects.get(id=wedding_id),然后将其作为变量的一部分传递给模板。

似乎这对自定义上下文处理器很有用。想知道创建一个能够读取URL的上下文处理器的最佳方法是什么,如果有婚礼ID,请在模板中包含一个婚礼对象。如果没有婚礼ID,则模板中的婚礼=无。

3 个答案:

答案 0 :(得分:1)

首先,我会确保您几乎每个请求都需要这个,因为您将在每个请求的显式查询中进行编码。 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}

答案 1 :(得分:0)

import re

def add_wedding_ring(request):
  if re.match('.*/id=.*',request.get_full_path()):
     return {'wid':Wedding.objects.get(id=wedding_id)}
  return {}

答案 2 :(得分:0)

@Brenden为什么上下文处理器?如果您使用Django>=1.3,那么您可以使用基于类的视图,如

class ViewWedding(DetailView):
  model = Wedding
  pk_url_kwarg = 'wedding_id'
  template_name = 'you-template.html'
  context_object_name = 'wedding'

是否值得拥有一个上下文处理器,而不是通过我认为它更灵活,更可行的context_processor方式从视图中传递wedding实例?

谢谢,

苏丹