我有以下功能,我在所有应用程序和几乎所有视图功能中调用。
def get_customer(request):
return request.user.customer
我想拥有一个可以从每个应用程序调用的函数,甚至可以在每个视图中使用此值。
我该怎么做?
答案 0 :(得分:1)
我不确定你想如何使用,但是如果你需要一些可重用的东西主要用于模板(因为视图根据请求处理逻辑的方式不同),那么你可以继续使用bellow方法,如果你需要在不同的东西可重用的东西堆栈的一部分,然后在适当的部分导入一个简单的函数/类就足够了。 如果你想在视图中注入一个可重用的var,那么context.processor就是拥有这种逻辑的好地方。
在你的一个应用程序中创建一个context_processors.py文件(名称无关紧要,但总是很好地遵循Django命名方案的可读性)(很可能是主要处理逻辑的应用程序,可能是客户应用程序)。
在context_processors.py中:
def get_customer(request):
try:
customer = request.user.customer
return {'customer': customer}
except:
"""
You need to always return a dictionary, even empty.
"""
return {}
在TEMPLATE_CONTEXT_PROCESSORS(settings.py)中启用上下文处理器:
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contry.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages"
"yourapp.context_processors.get_customer"
)
您可以在模板中访问:
{% if customer %}
...
{% endif %}
请注意,创建不会与其他部分冲突的名称是明智的,因此最好为传递的元素命名 与myappcustomer一样更独特的东西。
如果您正在使用CBV(基于类的视图),您可以创建一个Mixin并重复使用它:
class MyCustomerMixin(object):
def get_context_data(self, **kwargs):
context = super(MyCustomerMixin, self).get_context_data(**kwargs)
if self.request.user:
try:
context['mycustomer'] = self.request.user.customer
except:
pass
return context
然后在您的视图中使用它:
class SomeView(MyCustomerMixin, TemplateView):
....