Функция добавления новой страницы не работает так, как должна. Как я могу добавить новую страницу? 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()
})