#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, а затем обновить базу данных.