Мой цикл for перестает работать, когда я добавляю условие else
Я пытаюсь определить функцию для создания новой страницы в вики-приложении. Пользователь должен указать заголовок и содержание. Если заголовок уже существует в списке, пользователь должен получить сообщение об ошибке. Если нет, то новая запись должна быть сохранена в списке с ее содержанием.
Вот мой код на данный момент:
def new_page(request):
if request.method == "POST":
title = request.POST.get("title")
entries = util.list_entries() #this function is already defined and it returns a list of all names of encyclopedia entries.
for entry in entries:
if title.lower() == entry.lower():
return HttpResponse(f"ERROR: {entry} Already Exists")
else:
return render(request,"encyclopedia/new_page.html")
Приведенный выше код работает нормально, когда я ввожу существующее название, я получаю сообщение об ошибке.
Проблема начинается, когда я добавляю условие else. Вот пример (просто для опробования кода, я не хочу, чтобы содержимое было сохранено)
def new_page(request):
if request.method == "POST":
title = request.POST.get("title")
entries = util.list_entries()
for entry in entries:
if title.lower() == entry.lower():
return HttpResponse(f"ERROR: {entry} Already Exists")
else:
return HttpResponse("Thank you for your contribution!")
else:
return render(request,"encyclopedia/new_page.html")
Теперь, даже если я ввожу существующее название, я получаю "Спасибо за ваш вклад!". Я не смог понять, что может быть причиной этой проблемы. Не могли бы вы помочь?
new_page.html:
{% extends "encyclopedia/layout.html" %}
{% block title %}
Create New Page
{% endblock %}
{% block body %}
<h1>Create Your Entry</h1>
<form action="{% url 'new_page' %}" method="POST">
{% csrf_token %}
<input type="text" name="title" placeholder="Title" style="width: 200px; text-align: center;">
<textarea name="new_entry" id="new_entry" cols="30" rows="10"></textarea>
<input type="submit" name="save_entry" id="save_entry" value="Save">
</form>
{% endblock %}
Функция завершается из-за оператора return в else в цикле for.
Вы должны сохранить в переменной, существует ли уже страница, подобно следующему:
def new_page(request):
if request.method == "POST":
title = request.POST.get("title")
entries = util.list_entries()
pageExists=False
for entry in entries:
if title.lower() == entry.lower():
pageExists=True
if pageExists:
return return HttpResponse(f"ERROR: {entry} Already Exists")
else:
return HttpResponse(f"ERROR: {entry} Already Exists")
else:
return render(request,"encyclopedia/new_page.html")
Оператор return
приводит к выходу функции на первой итерации цикла, которая не является попаданием. Вы должны переместить оператор return
на два уровня вверх следующим образом:
def new_page(request):
if request.method == "POST":
title = request.POST.get("title")
entries = util.list_entries()
for entry in entries:
if title.lower() == entry.lower():
return HttpResponse(f"ERROR: {entry} Already Exists")
# the loop is finished and did not find an existing entry, return success
return HttpResponse("Thank you for your contribution!")
else:
return render(request,"encyclopedia/new_page.html")