如何检查(在模板中)用户是否属于某个组
How to check (in template) if user belongs to a group
如何在模板中检查用户是否属于某个组?
在生成 template
的 view
中是可能的,但是如果我想在 base.html
中检查它,它是一个扩展模板(它没有自己的模板)查看函数)?
我的所有模板都扩展了 base.html
,所以在每个 view
中检查它并不好。
base.html
包含上部栏,其中应包含按钮,具体取决于 group
登录用户所在的位置(客户、卖家)。
在我的base.html
中是:
{% if user.is_authenticated %}
这还不够,因为我必须对来自 Customers
的用户和来自 Sellers
的用户采取不同的行动。
所以我想要的是:
{% if user.in_group('Customers') %}
<p>Customer</p>
{% endif %}
{% if user.in_group('Sellers') %}
<p>Seller</p>
{% endif %}
您需要自定义模板标签:
from django import template
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
return user.groups.filter(name=group_name).exists()
在您的模板中:
{% if request.user|has_group:"mygroup" %}
<p>User belongs to my group
{% else %}
<p>User doesn't belong to mygroup</p>
{% endif %}
来源:http://www.abidibo.net/blog/2014/05/22/check-if-user-belongs-group-django-templates/
文档:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/
在您的应用中创建一个文件夹 'templatetags'。在此文件夹中创建两个文件:
__init__.py
auth_extras.py
from django import template
from django.contrib.auth.models import Group
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
group = Group.objects.get(name=group_name)
return True if group in user.groups.all() else False
现在应该是这样的:
app/
__init__.py
models.py
templatetags/
__init__.py
auth_extras.py
views.py
After adding the templatetags module, you will need to restart your server before you can use the tags or filters in templates.
在您的 base.html(模板)中使用以下内容:
{% load auth_extras %}
并检查用户是否在组 "moderator":
{% if request.user|has_group:"moderator" %}
<p>moderator</p>
{% endif %}
文档:https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/
在您的模板中
{% ifequal user.groups.all.0.name "user" %}
This is User
{% endifequal %}
请注意,如果该组在数据库中不存在,您将得到一个异常。
自定义模板标签应该是:
from django import template
from django.contrib.auth.models import Group
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
try:
group = Group.objects.get(name=group_name)
except Group.DoesNotExist:
return False
return group in user.groups.all()
您的模板:
{% if request.user|has_group:"mygroup" %}
<p>User belongs to my group
{% else %}
<p>User doesn't belong to mygroup</p>
{% endif %}
我认为最好的方法是:
yourapp/templatetags/templatetagname.py
from django import template
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
return user.groups.filter(name=group_name).exists()
yourapp/templates/yourapp/yourtemplate.html:
{% load has_group %}
{% if request.user|has_group:"mygroup" %}
<p>User belongs to my group</p>
{% else %}
<p>User does not belong to my group</p>
{% endif %}
编辑:按照评论中的建议添加了带有模板标签加载的行。
EDIT2:修复了小错字。
{% if target_group in user.groups.all.0.name %}
# do your stuff
{% endif %}
虽然mishbah给出的答案是对的,但是对我没用。
我正在使用 Django 2.2.7,我发现 register = template.Library()
应该替换为 from django.template.defaultfilters import register
。
我希望有人会发现它有用。
你可以使用这个:
{% for group_for in request.user.groups.all %}
{% if group_for.name == 'Customers' %}
Text showed to users in group 'Customers'
{% elif group_for.name == 'Sellers' %}
Text showed to users in group 'Sellers'
{% endif %}
{% endfor %}
这是遍历与发出请求的用户相关的组,如果迭代组的名称等于 'Customers'、'Sellers' 等
,则打印文本
我发现的最简单的方法是使用 context_preprocessor
将所有组名称添加到上下文中
在您的应用中创建一个文件 context_processors.py
并添加以下内容:
def user_groups_processor(request):
groups = []
user = request.user
if user.is_authenticated:
groups = list(user.groups.values_list('name',flat = True))
return {'groups': groups}
在您的设置中,添加新的上下文处理器
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
"context_processors": [
"my_app.context_processors.user_groups_processor"
],
},
},
]
或者如果您更喜欢 settings.py
TEMPLATES[0]['OPTIONS']['context_processors'].append("my_app.context_processors.user_groups_processor")
之后,您可以在模板中使用:
{% if 'vip' in groups %}
<p>Paragraph only visible to VIPs</p>
{% endif %}
首先你需要在里面定义一个自定义的过滤函数has_group.py
from django import template
from xx.models import Xuser
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
try:
group = Xuser.objects.get(email=user.email)
if group.role == group_name:
return True
else:
return False
except Xuser.DoesNotExist:
return False
return group
在django settings.py
文件中你需要添加
'libraries': {
'my_templatetag': 'xx.templates.has_group',
},
里面TEMPLATES = []
然后添加
{% load my_templatetag %}
在你的 example.html
最后
{% if user|has_group:"admin" %}
{% endif %}
在我的例子中,问题是,我使用的是 {% load filter_method_name %}
我不得不改成{% load filename %}
例如,
app/
__init__.py
models.py
templatetags/
__init__.py
auth_extras.py
views.py
此处,模板 taq 将为 {% load auth_extras %}
然后我不得不重新启动服务器。
如何在模板中检查用户是否属于某个组?
在生成 template
的 view
中是可能的,但是如果我想在 base.html
中检查它,它是一个扩展模板(它没有自己的模板)查看函数)?
我的所有模板都扩展了 base.html
,所以在每个 view
中检查它并不好。
base.html
包含上部栏,其中应包含按钮,具体取决于 group
登录用户所在的位置(客户、卖家)。
在我的base.html
中是:
{% if user.is_authenticated %}
这还不够,因为我必须对来自 Customers
的用户和来自 Sellers
的用户采取不同的行动。
所以我想要的是:
{% if user.in_group('Customers') %}
<p>Customer</p>
{% endif %}
{% if user.in_group('Sellers') %}
<p>Seller</p>
{% endif %}
您需要自定义模板标签:
from django import template
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
return user.groups.filter(name=group_name).exists()
在您的模板中:
{% if request.user|has_group:"mygroup" %}
<p>User belongs to my group
{% else %}
<p>User doesn't belong to mygroup</p>
{% endif %}
来源:http://www.abidibo.net/blog/2014/05/22/check-if-user-belongs-group-django-templates/
文档:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/
在您的应用中创建一个文件夹 'templatetags'。在此文件夹中创建两个文件:
__init__.py
auth_extras.py
from django import template
from django.contrib.auth.models import Group
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
group = Group.objects.get(name=group_name)
return True if group in user.groups.all() else False
现在应该是这样的:
app/
__init__.py
models.py
templatetags/
__init__.py
auth_extras.py
views.py
After adding the templatetags module, you will need to restart your server before you can use the tags or filters in templates.
在您的 base.html(模板)中使用以下内容:
{% load auth_extras %}
并检查用户是否在组 "moderator":
{% if request.user|has_group:"moderator" %}
<p>moderator</p>
{% endif %}
文档:https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/
在您的模板中
{% ifequal user.groups.all.0.name "user" %}
This is User
{% endifequal %}
请注意,如果该组在数据库中不存在,您将得到一个异常。
自定义模板标签应该是:
from django import template
from django.contrib.auth.models import Group
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
try:
group = Group.objects.get(name=group_name)
except Group.DoesNotExist:
return False
return group in user.groups.all()
您的模板:
{% if request.user|has_group:"mygroup" %}
<p>User belongs to my group
{% else %}
<p>User doesn't belong to mygroup</p>
{% endif %}
我认为最好的方法是:
yourapp/templatetags/templatetagname.py
from django import template
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
return user.groups.filter(name=group_name).exists()
yourapp/templates/yourapp/yourtemplate.html:
{% load has_group %}
{% if request.user|has_group:"mygroup" %}
<p>User belongs to my group</p>
{% else %}
<p>User does not belong to my group</p>
{% endif %}
编辑:按照评论中的建议添加了带有模板标签加载的行。
EDIT2:修复了小错字。
{% if target_group in user.groups.all.0.name %}
# do your stuff
{% endif %}
虽然mishbah给出的答案是对的,但是对我没用。
我正在使用 Django 2.2.7,我发现 register = template.Library()
应该替换为 from django.template.defaultfilters import register
。
我希望有人会发现它有用。
你可以使用这个:
{% for group_for in request.user.groups.all %}
{% if group_for.name == 'Customers' %}
Text showed to users in group 'Customers'
{% elif group_for.name == 'Sellers' %}
Text showed to users in group 'Sellers'
{% endif %}
{% endfor %}
这是遍历与发出请求的用户相关的组,如果迭代组的名称等于 'Customers'、'Sellers' 等
,则打印文本我发现的最简单的方法是使用 context_preprocessor
在您的应用中创建一个文件 context_processors.py
并添加以下内容:
def user_groups_processor(request):
groups = []
user = request.user
if user.is_authenticated:
groups = list(user.groups.values_list('name',flat = True))
return {'groups': groups}
在您的设置中,添加新的上下文处理器
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
"context_processors": [
"my_app.context_processors.user_groups_processor"
],
},
},
]
或者如果您更喜欢 settings.py
TEMPLATES[0]['OPTIONS']['context_processors'].append("my_app.context_processors.user_groups_processor")
之后,您可以在模板中使用:
{% if 'vip' in groups %}
<p>Paragraph only visible to VIPs</p>
{% endif %}
首先你需要在里面定义一个自定义的过滤函数has_group.py
from django import template
from xx.models import Xuser
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
try:
group = Xuser.objects.get(email=user.email)
if group.role == group_name:
return True
else:
return False
except Xuser.DoesNotExist:
return False
return group
在django settings.py
文件中你需要添加
'libraries': {
'my_templatetag': 'xx.templates.has_group',
},
里面TEMPLATES = []
然后添加
{% load my_templatetag %}
在你的 example.html
最后
{% if user|has_group:"admin" %}
{% endif %}
在我的例子中,问题是,我使用的是 {% load filter_method_name %}
我不得不改成{% load filename %}
例如,
app/
__init__.py
models.py
templatetags/
__init__.py
auth_extras.py
views.py
此处,模板 taq 将为 {% load auth_extras %}
然后我不得不重新启动服务器。