NoReverseMatch как следствие действия формы
Это мой urls.py:
from django.urls import path
from . import views
urlpatterns = [
path("", views.rando, name="rando"),
path("wiki", views.index, name="index"),
path("create", views.create, name="create"),
path("wiki/<str:title>", views.title, name="title"),
path("wiki/<str:title>/edit", views.edit, name="edit"),
]
Это мой views.py:
def edit(request, title):
if request.method=="POST":
content = request.POST.get("content")
util.save_entry(title, content)
return redirect(f'/wiki/{title}')
elif request.method=="GET":
if title in util.list_entries():
ge = util.get_entry(title)
return render(request, "encyclopedia/edit.html", {
"title": title,
"ge": ge
})
else:
return render(request, "encyclopedia/error.html")
Вот что я хочу отобразить (edit.html):
{% block body %}
<h1>Edit {{title}}</h1>
<form action="{% url 'edit' %}" method="post">
{% csrf_token %}
<textarea id="ctnt" name="content">{{ge}}</textarea>
<br>
<input type="submit" value="Submit">
</form>
{% endblock %}
Когда я хочу отправить форму выше с текущим действием, он выдает мне: NoReverseMatch at /wiki/CSS/edit
но когда я удаляю действие, оно не выдает никакой ошибки. Не могли бы вы сказать мне, почему это происходит?
Спасибо
reverse
ищет представление в пространстве именования. После этого он пытается передать необходимые переменные, но вы не указали ни одной с помощью {% url 'edit' %}
. Это должно быть {% url 'name_space' first_argument second_argument etc. %}
, так что в вашем случае: {% url 'edit' title %}
.
Но, как я понимаю вашу точку зрения, это бессмысленно делать такое действие (потому что у вас есть редирект в if request.method=="POST"
части), и по умолчанию старайтесь не делать этого. Хорошая практика - иметь такое поведение бэкенда непосредственно в ваших views.py
файлах.
Для того чтобы это работало, django требует, чтобы вы передали заголовок в url-путь. Он должен быть примерно таким
<form action="{% url 'edit' wiki.title %}" method="post">
и не
<form action="{% url 'edit' %}" method="post">