Проверьте, существует ли текст в переменной контекста шаблона Django - PullRequest
0 голосов
/ 05 ноября 2018

Возможно, это не лучший способ сделать это (открыто для предложений). Но я хочу отобразить кнопку на моей домашней странице в зависимости от значения логического значения в пользовательской модели пользователя. Я передаю значение этого логического значения через контекст в представлении. Но я не могу заставить логику шаблона работать.

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

Я не вижу кнопку «newEquipment», хотя контекст adminStatus равен «True», что подтверждается командой print (). У меня ощущение, что моя шаблонная логика неверна. Я также попробовал:

{% if adminStatus contains "True" %}

1 Ответ

0 голосов
/ 05 ноября 2018

В представлении 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 %}
...