Функция добавления новой страницы не работает так, как должна. Как я могу добавить новую страницу? Django

Я пытаюсь создать функцию Addpage со следующими возможностями;

  • При нажатии на кнопку "Создать новую страницу" в боковой панели пользователь должен перейти на страницу, где он может создать новую запись в энциклопедии.
  • При сохранении страницы, если запись энциклопедии с указанным названием уже существует, пользователю должно быть представлено сообщение об ошибке.
  • В противном случае запись энциклопедии должна быть сохранена на диск, а пользователь должен перейти на страницу новой записи.

VIEWS.PY

class AddPageForm(forms.Form):
    title = forms.CharField()
    content = forms.CharField(widget=forms.Textarea(
        attrs={
            "class": "form-control",
        })
    )

def add_page(request):
    if request.method == "POST":
        form = AddPageForm(request.POST)
        
        if form.is_valid():
            title = form.cleaned_data['title']
            content = form.cleaned_data['content']
            # saveInput = SaveInput(title=data['title'], content=data['content'])
            # saveInput.save()
            entries = util.list_entries()
            for entry in entries:
                if title.upper() == entry.upper():
                    return render(request, "encyclopedia/errorpage.html")
                else:
                    return redirect('encyclopedia:entrypage', title=title)
            util.save_entry(title, content)
    else:
        return render(request, "encyclopedia/addpage.html", {
            "form": AddPageForm()
        })

URL.PY

app_name = "encyclopedia"

urlpatterns = [
    path("", views.index, name="index"),
    path("wiki/<str:title>", views.entry_page, name="entrypage"),
    path("add_page", views.add_page, name="addpage"),

ADDPAGE.HTML

<h1>Add Page</h1>
        <form action="{% url 'encyclopedia:addpage' %}" method="post">
            {% csrf_token %}
            {{ form }}
            <input type="submit" value="Submit" class="btn btn-secondary">
        </form>
{% endblock %}

UTILS.PY

def save_entry(title, content):
    """
    Saves an encyclopedia entry, given its title and Markdown
    content. If an existing entry with the same title already exists,
    it is replaced.
    """
    filename = f"entries/{title}.md"
    if default_storage.exists(filename):
        default_storage.delete(filename)
    default_storage.save(filename, ContentFile(content))

def list_entries():
    """
    Returns a list of all names of encyclopedia entries.
    """
    _, filenames = default_storage.listdir("entries")
    return list(sorted(re.sub(r"\.md$", "", filename)
                for filename in filenames if filename.endswith(".md")))

LAYOUT.HTML

<div>
  <a href="{% url 'encyclopedia:addpage' %}">Create New Page</a>
</div>

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что когда я нажимаю кнопку ADD и ввожу название, которое уже существует, например, CSS, оно должно привести меня на страницу ошибки, но вместо этого оно отправляет, однако то, что я ввожу, не сохраняется в записи/домашней странице.

Вторая проблема заключается в том, что когда я нажимаю кнопку ADD и ввожу новый заголовок (который должен отправляться и сохраняться на моей домашней странице), вместо этого я попадаю на страницу ошибки.

Могли бы вы указать, что я делаю неправильно?

В вашем цикле for он будет проверять только первый элемент, и если он не является существующей записью, он немедленно перенаправит (он никогда не дойдет до второго элемента). Тогда как вы, вероятно, хотели, чтобы он проверял все записи, и если она не существует, то добавлял и перенаправлял?

Например, будет ли это работать лучше?

def add_page(request):
    if request.method == "POST":
        form = AddPageForm(request.POST)
        
        if form.is_valid():
            title = form.cleaned_data['title']
            content = form.cleaned_data['content']
            entries = util.list_entries()
            for entry in entries:
                if title.upper() == entry.upper():
                    return render(request, "encyclopedia/errorpage.html")
            util.save_entry(title, content)
            return redirect('encyclopedia:entrypage', title=title)
    else:
        return render(request, "encyclopedia/addpage.html", {
            "form": AddPageForm()
        })
Вернуться на верх