【问题标题】:different roles in Django: show different content in web pageDjango中的不同角色:在网页中显示不同的内容
【发布时间】:2016-07-22 13:01:56
【问题描述】:

我正在使用 Django 开发一个 webapp,我创建了不同的用户角色,例如CunstomerUser, GoodUser, Admin...等。

现在我想在他们登录时向他们展示不同的东西。例如,当他们打开一个弹出窗口时,CustomerUser 将看到一个用于评论的 textarea 字段,而对于 Admin,他将看到他可以做的其他事情。

我发现我们可以在template级别做到这一点,比如:

{% if request.user.is_superuser %}
.... superuser content
{% else %}
.... non-superuser content
{% endif %}

但是我该如何在这个template 使用的javascript 文件中做呢?因为我想向他们展示不同的功能取决于他们的角色。例如我想确定模板中包含的example.js中的角色:

<html>
<script type="text/javascript" src="example.js"></script>
...
</html>

我目前找到的解决方案是在模板中创建一个变量全局javascript,这样所有的javascipt文件都可以使用:

<script>
 var userType = '{{user.get_usertype}}';
</scirpt> 

但是他们是更好的方法吗?我认为变量 global 不太好用……也许我使用了转储模式设计。有任何想法吗?谢谢!

【问题讨论】:

  • 我认为最合适的方法是在视图中检查用户角色,从而为其呈现不同的模板。如果你的模板有很多共同的内容,你可以使用Django的{% include %}{% block %}标签来遵循DRY原则。

标签: javascript python django


【解决方案1】:

我可能错了,但您仍然可以在 javascript 中使用 django 模板语法,因为 django 模板在页面加载之前进行评估,因此它仍然可以通过隐藏/显示与特定用户相关的部分来工作:

<script>
{% if request.user.is_superuser %}
    var userType = 'superuser';
{% else %}
    var userType = 'normaluser';
{% endif %}
</script>

上面的代码块不必是全局的,它可以发生在模板文件中的任何地方。在这种情况下,您总是只会得到一个 userType 的定义。

编辑:

好吧,避免使用全局变量是因为它们可能会被其他函数更改,因此值可能会混乱。但是,如果您定义伪常量,那么您应该没问题。

Javascript 没有常量,但您可以使用任何带有 id 的 html 来实现:

html:

<p style="display: none;" class="identity" id="{% if request.user.is_superuser %}superuser{% else %}normaluser{% endif %}"></p>

example.js:

var user_role = $('p.identity').attr('id');

需要注意的是,您需要在模板末尾加载example.js,否则它将在 html 加载之前加载,因此找不到元素。

【讨论】:

  • 抱歉没有说清楚...你能看到我上面的更新问题吗?谢谢
  • 不,你是对的,你可以通过这种方式使用模板 + javascript,但有时它会变得非常复杂。无论如何+1
  • 我编辑了我的答案,有点复杂,但看看它是否有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
相关资源
最近更新 更多