Мой цикл 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")
Вернуться на верх