我正在建立一个婚礼网站创建者(请不要判断)。
几乎每个视图都需要调用 aWedding.objects.get(id=wedding_id)
然后将其作为变量的一部分传递给模板。
似乎这对自定义上下文处理器很有用。想知道创建可以读取 URL 的上下文处理器的最佳方法是什么,如果有婚礼 ID,请在模板中包含一个婚礼对象。如果没有婚礼 ID,则模板中的婚礼=无。
我正在建立一个婚礼网站创建者(请不要判断)。
几乎每个视图都需要调用 aWedding.objects.get(id=wedding_id)
然后将其作为变量的一部分传递给模板。
似乎这对自定义上下文处理器很有用。想知道创建可以读取 URL 的上下文处理器的最佳方法是什么,如果有婚礼 ID,请在模板中包含一个婚礼对象。如果没有婚礼 ID,则模板中的婚礼=无。
首先,我会确保您对于几乎每个请求都确实需要它,因为您将在对每个请求的显式查询中进行编码。查询是即时的get
,而不是惰性的filter
。如果您想让它更懒惰,您可以将 get 包装在一个小的“get_wedding”包装器中,或者使用 afilter
并从列表中获取它......
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 {}
@Brenden 为什么是上下文处理器?如果您使用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 更灵活和更可取的方式从视图传递实例?
谢谢,
苏丹