#python #django #redirect
Вопрос:
Я работаю над приложением, которое позволяет пользователю создавать, показывать и редактировать запись. прямо сейчас я работаю над функцией редактирования. то, что я пытаюсь сделать, — это кнопка редактирования (на самом деле это форма, которая отправляет данные через скрытые входы), которая отправляет заголовок записи в представление под названием trans, единственной целью которого является перенаправление на представление редактирования, причина, по которой я это сделал, заключается в том, что, когда я работаю над представлением редактирования, я могу упростить процесс, когда, если метод запроса GET, он показывает страницу с формой, где пользователь может редактировать запись, и если это сообщение, представление редактирования может получать изменения и сохранять их, не беспокоясь о перенаправлении со страницы записи.
Проблема заключается в том, что каждый раз, когда я нажимаю кнопку редактирования, я получаю сообщение об ошибке:
NoReverseMatch at /wiki/trans
Reverse for 'edit' with keyword arguments '{'title': 'Python'}' not found.
Я снова и снова проверял, нет ли ошибок в написании или проблем в urls.py или какие — либо проблемы с именем, но я просто не могу найти ошибку. и это расстраивает, потому что я думал, что это будет самая легкая часть проекта.
Ниже приведен соответствующий код. я был бы чрезвычайно благодарен любому, кто укажет, что я делаю неправильно. Заранее спасибо.
HTML
<div id="edit">
<form action="{% url 'wiki:trans' %}" method="POST">
{% csrf_token %}
<input type=hidden value={{title}} name="title">
<input type=submit value="Edit">
</form>
</div>
views.py
class EntryForm(forms.Form):
title = forms.CharField(label="Title")
content = forms.CharField(widget=forms.Textarea)
def trans(request):
title = request.POST.get("title")
return redirect("wiki:edit", title=title)
def edit(request, title):
if request.method == "GET":
entry = util.get_entry(title)
return render(request, "encyclopedia/edit.html", {
"form": EntryForm({
"content": entry,
"title": title
})
})
else:
form = EntryForm(request.POST)
if form.is_valid():
title = form.cleaned_data["title"]
content = form.cleaned_data["content"]
util.save_entry(title, content)
return redirect("wiki:title", title=title)
urls.py
app_name = "wiki"
urlpatterns = [
path("", views.index, name="index"),
path("search", views.search, name="search"),
path("new", views.new, name="new"),
path("trans", views.trans, name="trans"),
path("edit", views.edit, name="edit"),
path("random", views.rand, name="random"),
path("<str:title>", views.title, name="title")
]
Комментарии:
1. Как выглядит ваш корень
urls.py
?2. Это вызвано этой строкой:
return redirect("wiki:edit", title=title)
вtrans
поле зрения. Вы передаете кваргу титулwiki:edit
, но в вашемurls.py
случае он не ожидает получения каких-либо кваргов3. Приложение называется энциклопедией, поэтому путь находится в списке, называемом URL-шаблонами.
path('wiki/', include("encyclopedia.urls))
4. В проекте есть только одно приложение (это), и другие функции просмотра работают просто отлично. Каков корень urls.py актуально?
5. Просто заметил, что ваш
edit
взгляд принимаетtitle
кварг. Может быть, измените свой URL-адрес, чтобы принять это? Нравится"edit/<str:title>"
Ответ №1:
Попробуйте добавить a /
в конце каждого URL-адреса, например так:
urls.py
:
app_name = "wiki"
urlpatterns = [
path("", views.index, name="index"),
path("search/", views.search, name="search"),
path("new/", views.new, name="new"),
path("trans/", views.trans, name="trans"),
path("edit/", views.edit, name="edit"),
path("random/", views.rand, name="random"),
path("<str:title>/", views.title, name="title")
]
Также попробуйте использовать реверс и передать заголовок в качестве аргумента на вашем views.py
:
return redirect(reverse('wiki:title', args=[title]))