模板中的条件标签

时间:2013-05-17 08:58:19

标签: django django-templates

我在现有的数据库/用户框架上使用Django,所以不幸的是我无法使用django auth框架。

我已经构建了自定义auth库,现在我只需要弄清楚如何在模板中使用它。某些链接只应出现在有权访问它的用户身上。

在PHP中,我可以像这样做

<?php if auth('RestrictedLinkName') {?> <a href=""></a> <?php } ?>

Django的方式是什么?我一直在玩自定义标签,但还没有能够使用它。我想的是:

{% if check_permission('Restrictedarea') %} hjkfgdkhfg  {% endif %}

2 个答案:

答案 0 :(得分:1)

如果您需要评估check_permission('Restrictedarea'),请在视图函数中执行此操作,并将评估结果传递给模板。

djangobook说(在第4章:模板,哲学和局限性部分) -

  

业务逻辑应与表示逻辑分开。 Django的   开发人员将模板系统视为控制演示的工具   和表达相关的逻辑 - 就是这样。模板系统   不应该支持超出这个基本目标的功能。

     

因此,不可能直接调用Python代码   Django模板。所有“编程”从根本上限于   模板标签的作用范围。可以编写自定义   模板标签做任意事情,但开箱即用的Django   模板标签故意不允许任意Python代码   执行。

如果需要编写自定义标签,请检查以下链接:

答案 1 :(得分:0)

您可以撰写custom template tags and filters。但这可能会帮助您达到某种程度,进一步说,您必须编写自定义context_processors(如果需要,还可以自定义middlewares。)

但是通过自定义功能进行身份验证和权限检查非常困难,但可能。我有一个完全运行自定义身份验证/授权的系统。

首先,您可以检查django context_processors以了解它们的工作原理。然后你可以编写自定义context_processor。在设置中添加上下文处理器后,您可以使用这些方法,并根据需要进行身份验证/授权。

我的一个自定义contect_processor功能就像:

from django.utils.functional import lazy

def CustomProcessor(request):
    cust_perms = {
        'admin_perm_check': lazy(lambda: myCustomPermChecker(request), myCustomPermChecker)(),
        'system_admin': aFunctionToReturnBoolValue(),
    }
    return custom_perms

class myCustomPermChecker(object):
    def __init__(self, request):
        self.request = request

    def __getitem__(self, perm_name):
        return True if (perm_name in user_perm_list()) else False

在您的模板中

{%if admin_perm_check.perm_name%}...{%endif%}
{%if system_admin %} this is a bool check{%endif%}

您必须将permchecker定义为具有__getitem__方法的类,因此,模板标记admin_perm_check.perm_name可以正常工作。这个perm检查器只接受一个额外的参数(perm_name),如果你想使用django风格的两个参数检查那么你必须这样做:

class myCustomPermChecker(object):
    def __init__(self):
        pass

    def __getitem__(self, module_name):
        return SecondPermCheckerStep(module_name)

class SecondPermCheckerStep(object):
    def __init__(self, module_name):
        self.module_name = module_name

    def __getitem__(self, perm_name)
        return True if ('%s.%s' % (self.module_name,perm_name) in user_perm_list()) else False


{%if admin_perm_check.module_name.perm_name%}

您可以使用另一个class.__getitem__在模板等中为游览代码链添加一个键。

由于context_processor CustomProcessor(request):接受http.request对象作为参数,您可以传递方法或函数,以验证身份或授权中所需的任何值(会话ID或用户ID等)。您可以编写一个中间件来为您的请求对象设置自定义值(例如django set user实例,并允许您在视图中使用request.user。)。您还可以设置自定义用户模型实例,以便在模板中使用它(如果在request_context中设置)和视图中(如果在中间件中设置它)

阅读文档在这里帮不了多多,更好的是检查django代码以了解django如何处理这个问题。