Django IndexError: ошибка выхода индекса списка за пределы диапазона

Я пробую этот код, который я нашел в Интернете. Когда я попробовал такие команды, как runserver, migrate и make migrations. Все они показали эту ошибку

Traceback (most recent call last):
  File "C:\Django\OLD\ToDo_Application-master\ToDo_Application-master\todos\views.py", line 129, in check_time
    task()
  File "C:\Django\OLD\ToDo_Application-master\ToDo_Application-master\todos\views.py", line 155, in is_expired
    if splited_notification_time[1] == "minutes":
IndexError: list index out of range

CODE OF is_expired :

def is_expired():
    connection = sqlite3.connect('db.sqlite3')
    cursor = connection.cursor()
    cursor.execute(
        " SELECT * FROM todos_todo where email_notification != '' AND notification_time != 'None' AND sent_reminder == 'False' ")
    rows = cursor.fetchall()
    todo_notify_time = 0

    for row in rows:
        todo_item_id = row[0]
        due_date_in_ms = int(datetime.fromisoformat(row[3]).timestamp() * 1000)
        current_date = int(datetime.now().timestamp() * 1000)
        splited_notification_time = str(row[6]).split(" ")
        receiver_email = row[5]
        sent_reminder = row[7]
        date_in_pst = due_date_in_ms - (7 * 60 * 60 * 1000)
        time_remaining = date_in_pst - current_date

        if splited_notification_time[0] != "None":
            if splited_notification_time[1] == "minutes":
                todo_notify_time = int(
                    (splited_notification_time[0])) * 60 * 1000
            elif splited_notification_time[1] == "hours":
                todo_notify_time = int(
                    (splited_notification_time[0])) * 60 * 60 * 1000
            elif splited_notification_time[1] == "day":
                todo_notify_time = int(
                    (splited_notification_time[0])) * 60 * 60 * 24 * 1000

        if time_remaining <= todo_notify_time:
            todo_item_expire = "Your todo_item name - " + \
                str(row[1]) + " will expire in " + str(row[6]) + "! "

            send_mail(
                'Todo_Notification',
                todo_item_expire,
                'noreply@todo_application.ca',
                [receiver_email],
                fail_silently=False,
            )

            selected_todo_item = get_object_or_404(Todo, pk=int(todo_item_id))
            selected_todo_item.sent_reminder = "True"
            selected_todo_item.save()

В коде есть одна строка, которая также показывает ошибку. Я вставил приведенный ниже код с ошибкой.

КОД :

<script>
     timer_interval("{{todo.id}}" , "{{ todo.due_date|date:"M d, Y H:i:s" }}");
</script>

ОШИБКА :

',' expected.javascript

Проверьте, что возвращает splited_notification_time. Похоже, что в " " нет row[6], в результате чего splited_notification_time будет списком длины 1. Поэтому не будет второго элемента (к которому вы пытаетесь получить доступ), что приведет к ошибке.

Во-первых, ответ Алека Гамильтона правильный, и я пропустил его, думая, что вы увидите только один символ в строке.

Я не уверен, что splited_notification_time должен возвращать, но поскольку он возвращает ['False'] попробуйте

if splited_notification_time[0] != "False":

Возможно, это только мне кажется, но ваш запрос выглядит как Flask, в отличие от Django.

connection = sqlite3.connect('db.sqlite3')
cursor = connection.cursor()
cursor.execute(
    " SELECT * FROM todos_todo where email_notification != '' AND notification_time != 'None' AND sent_reminder == 'False' ")
rows = cursor.fetchall()
print(rows)    # WHAT DOES THIS PRINT?

Попробуйте распечатать строки. Является ли это тем, что вы ожидаете? Возможно, проблема заключается в самом запросе? Если вам нужно использовать подобный запрос без использования Django ORM, то вы могли бы использовать raw SQL в Django.

Наконец, чтобы сделать мой ответ полным, ответ на вашу вторую ошибку, которую вы уже устранили, как я упоминал в своем комментарии, заключается в удалении двойных кавычек внутри двойных кавычек в вашем HTML, как это:

<!-- Change -->
    timer_interval("{{todo.id}}" , "{{ todo.due_date|date:"M d, Y H:i:s" }}");
<!-- to -->
    timer_interval("{{todo.id}}" , '{{ todo.due_date|date:"M d, Y H:i:s" }}');
Вернуться на верх