我正在建立一个婚礼网站创建者(请不要判断)。
几乎每个视图都需要调用Wedding.objects.get(id=wedding_id)
,然后将其作为变量的一部分传递给模板。
似乎这对自定义上下文处理器很有用。想知道创建一个能够读取URL的上下文处理器的最佳方法是什么,如果有婚礼ID,请在模板中包含一个婚礼对象。如果没有婚礼ID,则模板中的婚礼=无。
答案 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)
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
实例?
谢谢,
苏丹