This is my 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"),
]
This is my 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")
This is what I want to render (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 %}
When I want to send the form above with the current action it gives me: NoReverseMatch at /wiki/CSS/edit
but when I remove action it doesn't display any error. Could you please tell me why this happens?
Thank You
CodePudding user response:
reverse
method search for view that naming space. After that it tries to pass needed variables, but you didn't provide any with {% url 'edit' %}
. It should be {% url 'name' first_argument second_argument etc. %}
, so in your case: {% url 'edit' title %}
.
But as I can see your view, it's actually pointless to do such action (cause you have redirect in if request.method=="POST"
part), and by default try not to do that. It's good practice to have such backend behaviour directly in your views.py
files.
CodePudding user response:
For it to work django requires you pass a title to the url path. It should be something like this
<form action="{% url 'edit' wiki.title %}" method="post">
and not
<form action="{% url 'edit' %}" method="post">