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" }}');