我正在建设一个婚礼网站创建者(请不要判断)。Django站点的上下文处理器
几乎每个视图都需要调用Wedding.objects.get(id=wedding_id)
,然后将它作为变量的一部分传递给模板。
看起来像这样是自定义上下文处理器的好用处。想知道创建可以读取URL的上下文处理器以及是否有婚礼ID的最佳方式是在模板中包含一个婚礼对象。如果没有婚礼ID,则模板中的wedding = None。
我正在建设一个婚礼网站创建者(请不要判断)。Django站点的上下文处理器
几乎每个视图都需要调用Wedding.objects.get(id=wedding_id)
,然后将它作为变量的一部分传递给模板。
看起来像这样是自定义上下文处理器的好用处。想知道创建可以读取URL的上下文处理器以及是否有婚礼ID的最佳方式是在模板中包含一个婚礼对象。如果没有婚礼ID,则模板中的wedding = None。
首先,我会确保你真的需要这个几乎每一个请求,因为你会在每个请求的显式查询编码。 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}
现在,婚礼ID只是URL conf的一部分,而不是GET变量。所以它是http://weddingsite.com/wedding_id/photos。我会如何改变你的add_wedding_context来解决这个问题? – Brenden 2012-07-31 14:12:16
然后,你将不得不在这里使用另一种方法,使用正则表达式解析出婚礼ID。请注意,如果您的网址格式发生变化,您需要记住维护正则表达式。说实话,一个上下文管理器不适合这样做,因为它消除了在视图中处理错误状态和婚礼ID的能力。如果他们没有权限呢?或者它不存在?我只是在视图中执行必要的逻辑并检查结果。 – jdi 2012-07-31 14:59:25
import re
def add_wedding_ring(request):
if re.match('.*/id=.*',request.get_full_path()):
return {'wid':Wedding.objects.get(id=wedding_id)}
return {}
@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
例如多了一个背景处理器?
感谢,
苏丹
你试图创建尚未背景处理器?听起来像你刚刚描述你会做什么。创建读取url并返回查询的函数 – jdi 2012-07-31 03:41:04