检查Django模板上下文变量中是否存在文本

时间:2018-11-05 00:26:20

标签: django django-templates django-views

这可能不是最好的方法(建议公开)。但是我想在首页上显示一个按钮,具体取决于自定义用户模型中布尔值的值。 我通过视图中的上下文传递此布尔值。但是我似乎无法使模板逻辑正常工作。

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" %}

1 个答案:

答案 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 %}