0

Я новичок в Django, и я застрял в теге шаблона, который я не могу понять, как работать. Я знаю, что у меня что-то не хватает, но я написал его несколькими способами и не могу найти правильный способ сделать это. У меня есть диаграмма Морриса в моем приложении, которую я пытаюсь предоставить. Я хочу показать процент доступных операторов. В моей модели у меня есть логическое значение, которое говорит, если оператор is_available. Когда я передаю его обратно в шаблон, я хочу, чтобы тег шаблона запускал процент и возвращал значение в круговую диаграмму morris.Шаблон шаблона Django для логического значения

Вот мое мнение:

@login_required(login_url='login/') 
    def operator(request): 
     operators = Operator.objects.all() 
     operator_status = Operator.objects.values_list('is_available', flat=True) 
     context = { 
      'operators': operators, 
      'operators_available': operator_status, 
     } 
     return render(request, 'content/operator.html', context) 

Это шаблонный тег используется:

<div class="widget-detail-1"> 
<h2 class="p-t-10 m-b-0"> {{ operators_available | percentage_of:True }} </h2> 
</div> 
</div> 

и, наконец, мой шаблонный тег:

@register.filter(name='percentage_of') 
def percentage_of(part, whole): 
    try: 
     return "%d"[2:] % (float(part)/whole * 100) 
    except (ValueError, ZeroDivisionError): 
     return "Division by Zero" 
+0

Какая у вас ошибка или проблема? –

+0

Я не могу заставить его передать значение тегу шаблона, который можно обработать. Я могу передать true или false или

ответ

0

Его еще немного запутанным, что вы действительно хотите достичь и как выглядит ваша модель Operators и какие значения ваша переменная с. Но я постараюсь сделать некоторые догадки о том, что вы хотите сделать, и попытаться дать вам ответ.

Кажется, что вы смешиваете использование operators и operators_available, а также смешиваете использование типов данных, таких как float и booleans.

Позволяет пройти через код ...

# This returns all Model Instances of Operators. 
operators = Operator.objects.all() 
# This only returns a list of Booleans. E.g. [True, True, False, True, True] 
operator_status = Operator.objects.values_list('is_available', flat=True) 

В вашем шаблоне вы пишете следующее

<h2 class="p-t-10 m-b-0"> {{ operators_available | percentage_of:True }} </h2> 

Это соответствует вызову функции из percentage_of(operators_available, True). Помните также, что operators_available происходит от вашего .valus_list('is_available') и является логическим. Так что вы на самом деле делаете что-то вроде percentage_of(True, True).

Внутри percentage_of вы затем пытаетесь применить математику к этим логическим значениям с помощью (float(part)/whole * 100), или на самом деле больше похожи на float(True)/True * 100.

Решение

Убедитесь, что значения, которые вы передаете в контекст в формате, который вы ожидаете. В настоящее время похоже, что вы считаете, что передаете значения float, но на самом деле передаете логические значения. Попробуйте отлаживать или распечатывать значения перед применением тега шаблона к ним.

0

Ваших operators и operator_status переменных должно быть числом, как в ответ Маркуса Линд: в вашем коде, operators переменного является QuerySet объектов оператора, в то время как operator_status список. Самый простой способ, чтобы получить код для работы:

operators = Operator.objects.count() 
operator_status = Operator.objects.filter(is_available=True).count() 

И в шаблоне вам нужно передать в этих двух аргументов пользовательского фильтра (часть и целое):

{{ operators_available|percentage_of:operators }} 

Также я дону Не думаю, что вы хотите [2:] в форматировании строк, так как ваш * 100 уже превратил число в процент.

Смежные вопросы