【问题标题】:Context Processor for Django SiteDjango 站点的上下文处理器
【发布时间】:2012-07-31 03:11:38
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否尝试过创建上下文处理器?听起来你刚刚准确地描述了你会做什么。创建读取 url 并返回查询的函数

标签: python django django-context


【解决方案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}

【讨论】:

  • 现在婚礼 ID 只是 URL conf 的一部分,而不是 GET 变量。所以它是weddingsite.com/wedding_id/photos。我将如何更改您的 add_wedding_context 来解决这个问题?
  • 那么您将不得不使用此处使用正则表达式解析出婚礼 ID 的另一种方法。请注意,如果您的 url 模式发生更改,您将需要记住维护正则表达式。老实说,上下文管理器不适合这样做,因为它消除了您处理视图中带有婚礼 ID 的错误状态的能力。如果他们没有权限怎么办?或者它不存在?我只会在视图中执行必要的逻辑并检查结果。
【解决方案2】:

@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 更灵活和更可取?

谢谢,

苏丹

【讨论】:

    【解决方案3】:
    import re
    
    def add_wedding_ring(request):
      if re.match('.*/id=.*',request.get_full_path()):
         return {'wid':Wedding.objects.get(id=wedding_id)}
      return {}
    

    【讨论】:

      猜你喜欢
      • 2016-07-01
      • 1970-01-01
      • 2012-06-24
      • 2011-01-15
      • 2010-11-04
      • 1970-01-01
      • 2015-11-01
      • 2011-12-16
      • 2018-02-04
      相关资源
      最近更新 更多