перенаправление errot — NoReverseMatch: Обратный для «редактировать» с аргументами ключевого слова » {«заголовок»: «Python»} » не найден

#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]))