这可能不是最好的方法(建议公开)。但是我想在首页上显示一个按钮,具体取决于自定义用户模型中布尔值的值。 我通过视图中的上下文传递此布尔值。但是我似乎无法使模板逻辑正常工作。
Models.py
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
isAdmin = models.BooleanField(default = False,)
#more models...
views.py
from django.views.generic import TemplateView
from django.contrib.auth import get_user_model
from accounts.models import CustomUser
class HomePageView(TemplateView):
template_name = 'home.html'
def get_context_data(self, **kwargs):
context = super(HomePageView, self).get_context_data(**kwargs)
if self.request.user.is_authenticated:
adminStatus = CustomUser.objects.get(id=self.request.user.id)
print(adminStatus.isAdmin)
context['adminStatus'] = str(adminStatus.isAdmin)
return context
主页template.html
{% extends 'base.html' %}
{% block body %}
{% if user.is_authenticated %}
<h4>Hi {{ user.username }}!</h4>
<a class="btn btn-primary btn-lg" href="{% url 'dashboard' %}" role="button"> Go to Dashboard</a>
{% else %}
<p>You are not logged in</p>
<a href="{% url 'login' %}">login</a>
</div>
{% if adminStatus == "True" %}
<h1>test</h1>
<div class = "adminPanel">
<a class="btn btn-primary btn-lg" href="{% url 'newEquipment' %}" role="button"> add new equipment</a>
</div>
{% endif %}
{% endif %}
{% endblock %}
即使通过print()命令验证的adminStatus上下文等于“ True”,我也看不到“ newEquipment”按钮。 我感觉我的模板逻辑不正确。我也尝试过:
{% if adminStatus contains "True" %}
答案 0 :(得分:1)
在视图中,context['adminStatus']
仅在用户登录时定义。同时,在模板中,当用户未登录时,您正在检查adminStatus。
首先,return context
语句无需缩进一次,因此无论使用以下哪种上下文(带有或不带有adminStatus)都可用:
def get_context_data(self, **kwargs):
context = super(HomePageView, self).get_context_data(**kwargs)
if self.request.user.is_authenticated:
adminStatus = CustomUser.objects.get(id=self.request.user.id)
context['adminStatus'] = adminStatus.isAdmin
return context
接下来,是的,您可能需要修复模板逻辑。假设仅在用户登录后才要检查adminStatus,它应该看起来像:
{% if user.is_authenticated %}
<h4>Hi {{ user.username }}!</h4>
...
{% if adminStatus %}
<h1>test</h1>
...
{% endif %}
{% else %}
<p>You are not logged in</p>
...
{% endif %}
原始答案:
在视图中,您可能不必对adminStatus.isAdmin
进行字符串化。
context['adminStatus'] = adminStatus.isAdmin
如果将其作为布尔值传递给上下文,则应该能够在模板中使用此表达式:
{% if adminStatus %}