如何创建一个函数是views.py,以便views.py中的所有函数都可以使用它

时间:2016-03-21 05:52:25

标签: python django

您好我有以下定义

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

我在很多观点中都使用了这部分代码。我怎样才能定义它以便每次都不需要使用它?

3 个答案:

答案 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 }}个变量;并且您不必在视图中重复代码。