您好我有以下定义
if GroupProfile.objects.filter(id=self.request.session['ACL_gid'], permissions__codename='view_page'):
context['can_view_page'] = 1
else:
context['can_view_page'] = 0
return context
我在很多观点中都使用了这部分代码。我怎样才能定义它以便每次都不需要使用它?
答案 0 :(得分:2)
您可以在任何常见文件中编写函数,例如
def your_func(args):
#do your work
并将其导入到任何您想要使用它的地方,就像普通的python函数一样。
例如。 from common import your_func
答案 1 :(得分:0)
a)您可以在模型内或Modelmanager中创建一个方法(我认为这将是最优雅的解决方案):
class MyManager(models.Manager):
def can_view_page(self, acl_gid, perm_code = 'view_page'):
return 1 if self.filter(id=acl_gid, permissions__codename=perm_code) else 0
class GroupProfile(models.Model):
.....
objects = MyManager()
b)你可以在utils.py之类的东西中创建一个函数。 c)您可以创建一个Mixin类并将此功能放在那里。你总能做到这样的事情:
class MyMixin(object):
def get_context_data(self, **kwargs):
context = super(MyMixin, self).get_context_data(**kwargs)
context['can_view_page'] = 1 GroupProfile.objects.filter(id=self.request.session['ACL_gid'], permissions__codename='view_page') else 0
return context
但我不是这种方法的忠实粉丝,因为overrides
代替extend
- 我认为它并不是真的透明。
d)你可以创建一个装饰者!)但我认为使用它是非常正确的。
答案 2 :(得分:0)
您需要创建自定义template context processor,然后将其添加到TEMPLATES
设置中。上下文提供程序非常简单:
from .models import GroupProfile
def view_page(request):
if GroupProfile.objects.filter(id=self.request.session['ACL_gid'],
permissions__codename='view_page').count():
return {'can_view_page': 1}
return {'can_view_page': 0 }
将此文件保存在某处;理想情况下,在应用内(与models.py
文件相同的位置),然后将其添加到TEMPLATES
setting,请确保不要覆盖默认值。
完成设置后,您的所有模板都会有{{ can_view_page }}
个变量;并且您不必在视图中重复代码。