Как изменить формат объекта DateTimeField при его отображении в HTML с помощью Ajax?

models.py

class Log(models.Model):
    source = models.CharField(max_length=1000, default='')
    date = models.DateTimeField(default=datetime.now, blank = True)

views.py

Объекты в модели Log фильтруются таким образом, что рассматриваются только те, имена источников которых соответствуют определенному имени учетной записи. Значения этих допустимых объектов будут перечислены и возвращены с помощью JsonResponse.

def backlog_list(request): 
    account_name = request.POST['account_name']
    access_log = Log.objects.filter(source=account_name)
    return JsonResponse({"access_log":list(access_log.values())})

dashboard.html

Этот Ajax-скрипт возвращает имя учетной записи в views.py. Если нет допустимых объектов, HTML будет пустым; однако, в противном случае он отобразит его как this.

<h3>You scanned the QR code during these times.</h3>
<div id="display">
    
</div>

<script>
    $(document).ready(function(){
    
    setInterval(function(){
        $.ajax({
            type: 'POST',
            url : "/backlog_list",
            data:{
                  account_name:$('#account_name').val(),
                  csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val(),
                },
            success: function(response){
                console.log(response);
                $("#display").empty();
                for (var key in response.access_log)
                {
                    var temp="<div class='container darker'><span class='time-left'>"+response.access_log[key].date+"</span></div>";
                    $("#display").append(temp);
                }
            },
            error: function(response){
                alert('An error occurred')
            }
        });
    },1000);
    })
</script>

Моя цель состоит в том, чтобы дата и время отображались как "Jan. 10, 2000, 9:30:20 A.M."

Я попробовал изменить формат непосредственно из models.py, добавив "strftime", но срабатывает ответ на ошибку.

Вы пытаетесь отформатировать дату в HTML, добавив ее к строке. К сожалению, это не сработает, потому что значение даты будет рассматриваться как строка, а не как объект даты.

Чтобы отформатировать дату нужным образом, необходимо преобразовать ее в объект даты в JavaScript, а затем использовать функцию форматирования даты для преобразования ее в нужный формат строки.

Вот пример того, как это можно сделать:

// Parse the date value from the response into a date object
var date = new Date(response.access_log[key].date);

// Use the toLocaleDateString() function to format the date as "Jan. 10, 2000"
var dateString = date.toLocaleDateString('en-US', {
  month: 'short',
  day: 'numeric',
  year: 'numeric'
});

// Use the toLocaleTimeString() function to format the time as "9:30:20 A.M."
var timeString = date.toLocaleTimeString('en-US', {
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric',
  hour12: true
});

// Append the formatted date and time to the HTML
var temp="<div class='container darker'><span class='time-left'>" + dateString + ", " + timeString + "</span></div>";
$("#display").append(temp);

Подробнее о функциях toLocaleDateString() и toLocaleTimeString() можно прочитать в документации по JavaScript:

Один из способов установить нужный вам формат - с помощью Javascript, Tharun опубликовал пример в своем ответе.

Альтернативно, вы можете указать нужный вам формат в views.py:

def backlog_list(request): 
    ...
    dates = [
        val.strftime('%b. %d, %Y, %I:%M:%S %p') 
        for val in access_log.values_list("date", flat=True)
    ]
    return JsonResponse({"access_log":[{"date": d for d in dates}]})

Ссылка на строку формата - https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes

Вернуться на верх