1

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

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

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

4

3 回答 3

1

首先,我会确保您对于几乎每个请求都确实需要它,因为您将在对每个请求的显式查询中进行编码。查询是即时的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}
于 2012-07-31T04:03:57.053 回答
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 {}
于 2012-07-31T03:47:28.757 回答
0

@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 更灵活和更可取的方式从视图传递实例?

谢谢,

苏丹

于 2012-07-31T04:40:49.730 回答