Обратный для ‘edit’ без найденных аргументов. 1 шаблон (ы) испробован: [‘wiki/edit/(?P[^/] )/$’]

#html #python-3.x #django

#HTML #python-3.x #django

Вопрос:

Я пытаюсь создать вики-страницу, уже просматривал другие сообщения, но не смог решить мою проблему, кто-нибудь может помочь? Я получаю следующую ошибку: обратный для ‘edit’ без найденных аргументов. попробовано 1 шаблон (ы): [‘wiki/ edit/(?P[^/] )/$’]

По сути, это страница редактирования для редактирования записи в вики, кнопка для редактирования записи расположена по адресу entry.html , предполагается, что это отправит имя записи в качестве параметра в edit.url, затем я отредактирую его и отправлю через POST новое содержимое, чтобы переопределить фактическое содержимое записи.

Вот мой views.py

 def edit(request, entry):

if request.method == 'POST':
    content = request.POST.get('edit')
    util.save_entry(entry, content)
    
    return render(request, "encyclopedia/entry.html", {
        "entry": markdown2.markdown(util.get_entry(entry)),
        "title": entry
    })
else :
    return render(request, "encyclopedia/edit.html", {
    "entry": entry
    })
  

Вот мой urls.py

 from django.urls import path, re_path

from . import views    
app_name = "encyclopedia"
urlpatterns = [
  path("", views.redirect, name="redirect"),
  path("wiki", views.index, name="index"),
  path("wiki/search/", views.search, name="search"),
  path("wiki/newentry", views.new, name="new"),
  path("wiki/edit/<str:entry>/", views.edit, name="edit"),
  path("wiki/<str:entry>", views.entry, name="entry")
]
  

И мой edit.html

 {% extends 'encyclopedia/layout.html' %}

{% block title %}
Edit Page
{% endblock %}

{% block body %}
<form action="{% url 'encyclopedia:edit' %}" method="POST">
{% csrf_token %}

<label for="edit">Edit {{ entry }}</label>
<textarea id="edit" name="edit" style="display: block; height: 70%;"></textarea>
<button type="submit">Edit</button>
{% endblock %}
  

Я забыл поместить свой entry.html , это страница, на которой расположена кнопка edt4it, которая перенаправляет на edit.html через GET.

 {% extends "encyclopedia/layout.html" %}

{% block title %}
   {{ title }}
{% endblock %}

{% block body %}

{{ entry|safe }}

<a class="btn btn-primary" href="{% url'encyclopedia:edit'entry=title%}">Edit Entry</a>

 {% endblock %}
  

Ответ №1:

Вы должны передать значение для entry параметра, это, вероятно entry , параметр:

 <form action="{% url 'encyclopedia:edit' entry=entry %}" method="POST">  

Ошибка говорит о том, что не удается найти представление с именем encyclopedia:edit без параметров, что правильно, поскольку у него есть параметр entry . Таким образом, вам необходимо передать это в {% url … %} тег шаблона [Django-doc] .


Примечание: В случае успешного запроса POST вам следует создать redirect [Django-doc] для реализации шаблона Post / Redirect / Get [wiki] . Это позволяет избежать того, что вы делаете один и тот же запрос POST, когда пользователь обновляет браузер.

Комментарии:

1. Извините, я забыл поставить свой entry.html , я хотел бы отправить ссылку через GET на моей странице входа, есть какой-то способ сделать это? Или должно быть через POST?

2. @Brunol55: Стандарт HTTP гласит, что запрос GET не должен иметь побочных эффектов . Таким образом, редактирование записи в базе данных обычно должно выполняться с помощью POST / PATCH / PUT/ …

3. Но это должно быть через POST, или лучше через POST, но я не могу понять, почему он не принимает запись по этому пути («wiki/ edit/<str:entry>/», views.edit, name=»edit»), но он принимаетв моем пути ввода path («wiki/<str:entry>», views.entry, name=»entry») я просто хотел лучше это понять.

4. @Brunol55: требуется ( softwareengineering.stackexchange.com/a/188861/166310 ). Это также было бы небезопасно, поскольку поисковый робот в Интернете делает запросы GET и, таким образом, может «случайно» редактировать / удалять / … запись. Кроме того, для запроса GET Django не будет выполнять проверку CSRF.

5. Я думаю, что я не объяснил себя, или мы говорим о разных частях проблемы, мой edit.html имеет форму, в которой есть метод POST, который используется для редактирования записи, <form action=»{% url ‘encyclopedia:edit’ %}» method=»POST»> отсутствуетзапись = запись там, с этим проблем нет, я сомневаюсь в моем entry.html на этой кнопке <a class=»btn btn-primary» href=»{% url’encyclopedia:edit’entry=title%}»>Редактировать запись</a> эта кнопка должна привести пользователя кредактировать страницу через GET затем на странице редактирования пользователь должен отредактировать запись и отправить данные через POST, а затем обновить базу данных.