【问题标题】:Django template - dynamic variable nameDjango 模板 - 动态变量名
【发布时间】:2013-06-17 13:23:32
【问题描述】:

下午好,

如何在 Django 模板中使用变量名?

我有一个使用context 的自定义身份验证系统,has_perm 检查用户是否有权访问指定部分。

deptauth 是一个具有限制组名称的变量,即 SectionAdmin。我认为has.perm 实际上是在检查'deptauth',而不是我想要的变量值SectionAdmin

{%if has_perm.deptauth %}

我该怎么做? has_perm.{{depauth}} 或类似的东西?

编辑 - 更新代码

{% with arg_value="authval" %}
{% lookup has_perm "admintest" %}
{% endwith %}

{%if has_perm.authval %}
window.location = './portal/tickets/admin/add/{{dept}}/'+val;   
{% else %}
window.location = './portal/tickets/add/{{dept}}/'+val; 
{%endif%}     

has_perm 不是一个对象。它在我的上下文处理器(permchecker)中:

class permchecker(object):

def __init__(self, request):
    self.request = request
    pass

def __getitem__(self, perm_name):
    return check_perm(self.request, perm_name)  

【问题讨论】:

  • has_perm 这是您的自定义模板标签吗?
  • has_perm 不能是自定义模板标签。模板标签是if

标签: django


【解决方案1】:

您最好为此编写自己的custom template tag。做起来不难,这种情况也很正常。

我没有对此进行测试,但是这些方面的东西应该可以工作。记得正确处理错误!

def lookup(object, property):
    return getattr(object, property)()

register.simple_tag(lookup)

如果您尝试获取属性而不是执行方法,请删除那些()

并使用它:

{% lookup has_perm "depauth" %}

注意has_perm是一个变量,"depauth"是一个字符串值。这将传递字符串进行查找,即获取has_perm.depauth

你可以用变量来调用它:

{% with arg_value="depauth_other_value" %}
    {% lookup has_perm arg_value %}
{% endwith %}

这意味着将使用变量的值来查找它,即has_perm.depauth_other_value'。

【讨论】:

  • 同意。不幸的是,Django 模板并不适合您在此处尝试进行的那种更精细的区分。
  • 您好,我收到此错误:“proxy”对象没有属性“admintest”。看起来它将 admintest 视为属性而不是查找字符串
  • admintest 到底是什么?是字典吗?显示你用来调用模板标签的代码。
  • 嗨,admintest 只是一个字符串。 has_perm 获取此字符串并检查数据库以查看用户是否有权访问此字符串所代表的组
  • {% with arg_value="authval" %} {% lookup has_perm "admintest" %} {% endwith %} {%if has_perm.authval %} window.location = './portal/tickets /admin/add/{{dept}}/'+val; {% else %} window.location = './portal/tickets/add/{{dept}}/'+val; {%endif%}
【解决方案2】:

你可以这样试试,

{{ dict|key:key_name }}

过滤器:

def key(d, key_name):
    return d[key_name]
key = register.filter('key', key)

更多信息,django ticket

【讨论】:

  • 这仅适用于字典,不适用于对象的属性。
猜你喜欢
  • 2013-08-08
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
相关资源
最近更新 更多