2012-07-31 66 views
1

我正在建设一个婚礼网站创建者(请不要判断)。Django站点的上下文处理器

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

看起来像这样是自定义上下文处理器的好用处。想知道创建可以读取URL的上下文处理器以及是否有婚礼ID的最佳方式是在模板中包含一个婚礼对象。如果没有婚礼ID,则模板中的wedding = None。

+1

你试图创建尚未背景处理器?听起来像你刚刚描述你会做什么。创建读取url并返回查询的函数 – jdi 2012-07-31 03:41:04

回答

1

首先,我会确保你真的需要这个几乎每一个请求,因为你会在每个请求的显式查询编码。 A get查询是直接的,而不是懒惰的filter。如果你想让它更懒,你可以在一个小“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} 
+0

现在,婚礼ID只是URL conf的一部分,而不是GET变量。所以它是http://weddingsite.com/wedding_id/photos。我会如何改变你的add_wedding_context来解决这个问题? – Brenden 2012-07-31 14:12:16

+0

然后,你将不得不在这里使用另一种方法,使用正则表达式解析出婚礼ID。请注意,如果您的网址格式发生变化,您需要记住维护正则表达式。说实话,一个上下文管理器不适合这样做,因为它消除了在视图中处理错误状态和婚礼ID的能力。如果他们没有权限呢?或者它不存在?我只是在视图中执行必要的逻辑并检查结果。 – jdi 2012-07-31 14:59:25

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 {} 
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例如多了一个背景处理器?

感谢,

苏丹