Почему мой код Javascript возвращает объект object?
Я новичок в jquerry. Я пытался получить/просуммировать некоторые элементы из моих представлений django в jquerry. вот что у меня получилось
$(document).ready(function()
{
var sch = $('#sch-books');
var gov = $('#gov-books');
var total = sch.val() + gov.val();
$('#total').text("Total : " + total);
});
В моем шаблоне есть такие
<div id="sch-books" class="h6 mb-1">School copies - <b>{{ s_books.count }}</b></div>
<div id="gov-books"class="h6 mb-1">Govt copies - <b>{{ g_books.count }}</b></div>
<div id="total"></div>
Выводит Total :
Может кто-нибудь помочь мне разобраться.
вы можете попробовать использовать django-mathfilter для этой цели, потому что javascript может быть отключен пользователем, а django-mathfilter настолько мощный.
$ pip install django-mathfilters
Then add mathfilters to your INSTALLED_APPS.
тогда в шаблоне вы можете просто сделать что-то вроде этого.
{% load mathfilters %}
........
{% with s_books.count as s_book and g_books.count as g_book %}
<div id="sch-books" class="h6 mb-1">School copies - <b>{{ s_book }}</b></div>
<div id="gov-books"class="h6 mb-1">Govt copies - <b>{{ g_book }}</b></div>
<div id="total">{{ s_book|add:g_book }}</div>
{% endwith %}
для получения дополнительной информации читайте здесь https://pypi.org/project/django-mathfilters/
Предисловие: Я бы предложил вам сделать это в шаблоне, сейчас есть два ответа, показывающие как это сделать (здесь и здесь). (Я не работаю с Django.) Имейте в виду, что выполнение этого действия в коде на стороне клиента приведет к тому, что <div id="total"></div>
будет отображаться пустым очень недолго, а затем заполнится числом. Если этот элемент находится в поле зрения при загрузке страницы, пользователи увидят это мерцание - даже если они не смогут увидеть, что именно мерцает (что может раздражать). Избежать этого, сделав это в представлении Django, вероятно, будет лучше.
Но что касается вашего кода на стороне клиента:
У элементовdiv
нет value
, у них есть textContent
и innerHTML
(подробности см. в ответах на этот вопрос). Но содержимое этих элементов div
будет содержать множество других элементов, кроме искомых чисел. Хотя вы можете выделить число из текста (или получить его только из элемента b
внутри div
), оба эти решения хрупки и сломаются, если кто-то изменит шаблон, казалось бы, невинными способами.
Если вы действительно хотите обрабатывать это с помощью кода на стороне клиента, храните нужные вам значения в атрибутах data-*
на элементах div
:
<div id="sch-books" class="h6 mb-1" data-count="{{ s_books.count }}">School copies - <b>{{ s_books.count }}</b></div>
<div id="gov-books" class="h6 mb-1" data-count="{{ g_books.count }}">Govt copies - <b>{{ g_books.count }}</b></div>
<div id="total"></div>
Затем возьмите этот атрибут data-*
:
$(document).ready(function() {
const sch = +$("#sch-books").attr("data-count");
const gov = +$("#gov-books").attr("data-count");
const total = sch + gov;
$("#total").text(`Total : ${total}`);
});
Вместо привлечения js скрипта, я порекомендую создать total_value на стороне Django и перенести его в шаблон.
<div class="h6 mb-1" data-count="{{ s_books.count }}">School copies - <b>{{ s_books.count }}</b></div>
<div class="h6 mb-1" data-count="{{ g_books.count }}">Govt copies - <b>{{ g_books.count }}</b></div>
<div>{total_count}</div>
Я не уверен, каким способом вы следуете для рендеринга шаблона, но должен посмотреть на этот
# views.py
from django.shortcuts import render
def render_users(request):
g_books = {}
s_books = {}
context = {
"g_books": g_books,
"s_books": s_books,
"total_count": g_books.count + s_books.count
}
return render(request, 'books.html', context)
val()
возвращает атрибут value, как в <input type="text" value=something/>
, а html()
возвращает содержимое (innerHTML) выбранного элемента.
Так что измените свои коды следующим образом, и все будет в порядке.
(Я предполагаю, что django возвращает числовое значение в {{ s_books.count }}
и {{ g_books.count }}
).
$(document).ready(function()
{
var sch = $('#sch-books b').html(); // added b element and calling html()
var gov = $('#gov-books b').html(); // added b element and calling html()
var total = parseInt(sch) + parseInt(gov); // converted the string into number using parseInt()
$('#total').text("Total : " + total); // worked
});