Ошибка Django NoReverseMatch - путь к urls.py кажется совпадающим
В приложении Django, которое я создаю как проект для онлайн-курса, я ожидаю, что ссылка в одном шаблоне (entry.html) будет направлять на путь ("edit") в urls.py с переменной в url. Это должно инициировать функцию edit в views.py и отобразить шаблон edit.html.
Я получаю ошибку NoReverseMatch ("Reverse for 'edit' with no arguments not found. 1 pattern(s) tried: ['wiki/(?P<entry>[^/]+)/edit$']"
) после нажатия на ссылку в entry.html. Если я просматриваю источник страницы в entry.html на сервере разработки, я вижу, что url соответствует url в urls.py, но я все равно получаю эту ошибку.
В примере ниже "maggie" - это значение для entryTitle
, которое я пытаюсь передать.
entry.html:
{% block title %}
{{ entryTitle }}
{% endblock %}
{% block body %}
{{ entry|safe }}
<button>
<a href="{% url 'edit' entry=entryTitle %}">Edit Entry</a>
</button>
{% endblock %}
urls.py (последний путь в списке edit
)
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("wiki/<str:entry>", views.entry, name="entry"),
path("search", views.search, name="search"),
path("new", views.new_page, name="new"),
path("wiki/<str:entry>/edit", views.edit, name="edit")
]
редактируйте функцию в views.py
from django.http import HttpResponseRedirect
from django.urls import reverse
class EditPageForm(forms.Form):
content = forms.CharField(
widget=forms.Textarea(),
label="Edit Content:")
def edit(request, entry):
if request.method == "POST":
#Edit file and redirect
form = EditPageForm(request.POST)
if form.is_valid():
content = form.cleaned_data["content"]
util.save_entry(entry, content)
return HttpResponseRedirect(reverse('entry', kwargs={'entry': entry}))
else:
#Load form with initial values filled
content = util.get_entry(entry)
form = EditPageForm(initial={"content": content})
return render(request, "encyclopedia/edit.html", {
"editform": form,
"entryTitle": entry
})
Может ли кто-нибудь увидеть, что вызывает эту ошибку в моем коде? Я удивлен, потому что при просмотре источника страницы кажется, что {% url 'edit entry=entryTitle %}
правильно интерпретируется как wiki/maggie/edit
, который присутствует в urls.py с maggie
как <str:entry>
, и все же я получаю эту ошибку.
Вот скриншот источника страницы:
Я удалил свой предыдущий ответ, мои извинения. Вам следует облегчить себе жизнь и реструктурировать свой url
path('wiki/edit/<str:entry>', views.edit, name="edit")
<button href="{% url 'edit' entry=entryTitle %}"></button>
Это должно работать.
Предыдущий способ был:
path('wiki/<str:entry>/edit', views.edit, name="edit')
Я получаю сообщение об ошибке:
Reverse for 'edit' with keyword arguments '{'entry': ''}' not found. 1 pattern(s) tried: ['so/wiki/(?P<entry>[^/]+)/edit$']
Я не уверен почему, но это как-то связано с тем, что это объект, потому что передача жестко закодированной строки "maggie"
вместо entryTitle
работает нормально. Извините за всю эту путаницу.