【问题标题】:Check if text exists in Django template context variable检查 Django 模板上下文变量中是否存在文本
【发布时间】:2019-04-08 08:48:22
【问题描述】:

这可能不是最好的方法(欢迎提出建议)。但是我想根据自定义用户模型中的布尔值在我的主页上显示一个按钮。 我通过视图中的上下文传递这个布尔值的值。但我似乎无法让模板逻辑工作。

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

主页模板.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 %}

即使 adminStatus 上下文等于“True”,我也看不到“newEquipment”按钮,正如 print() 命令所验证的那样。 我感觉我的模板逻辑不正确。我也试过了:

{% if adminStatus contains "True" %}

【问题讨论】:

    标签: django django-templates django-views


    【解决方案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 %}
    

    【讨论】:

    • 感谢@LionelW。我先试过了,然后想也许它需要是一个字符串。那也没有用。不知道发生了什么。我开始怀疑是不是因为我有一个嵌套的 if 语句,不确定是否有一种特殊的方法可以用模板逻辑来处理这个......
    • 哎呀,为了清楚起见,重写了我的更新;在重要的事情上相当偏离基础。让我们知道进展如何。
    猜你喜欢
    • 2013-06-07
    • 2011-09-07
    • 2016-03-28
    • 1970-01-01
    • 2010-09-23
    • 2020-05-30
    • 1970-01-01
    • 2021-04-27
    • 2011-11-20
    相关资源
    最近更新 更多