【问题标题】:Reverse for 'edit' with no arguments not found. 1 pattern(s) tried: ['wiki/edit/(?P<entry>[^/]+)/$']未找到任何参数的“编辑”反向。尝试了 1 种模式:['wiki/edit/(?P<entry>[^/]+)/$']
【发布时间】:2021-02-05 23:45:12
【问题描述】:

我正在尝试构建一个 wiki 页面,已经搜索过其他帖子但无法解决我的问题,有人可以帮忙吗? 我收到以下错误:Reverse for 'edit' with no arguments not found。尝试了 1 种模式:['wiki/edit/(?P[^/]+)/$']

基本上它是一个编辑 wiki 条目的编辑页面,编辑条目的按钮位于 entry.html,这应该将条目名称作为参数发送到 edit.url 然后我编辑它并通过 POST 发送新内容以覆盖条目的实际内容。

这是我的意见.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按钮所在的页面,通过GET重定向到edit.html。

{% 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 %}

【问题讨论】:

    标签: html python-3.x django


    【解决方案1】:

    您应该为entry 参数传递一个值,这很可能是entry 参数:

    &lt;form action="{% url 'encyclopedia:edit' <b>entry=entry</b> %}" method="POST"&gt;

    错误说它无法找到名称为encyclopedia:edit 且带有no 参数的视图,这是正确的,因为它有一个参数entry。因此,您需要将其传递给{% url … %} template tag [Django-doc]


    注意:如果 POST 请求成功,请发送redirect [Django-doc] 实施Post/Redirect/Get pattern [wiki]。 这样可以避免在用户刷新时发出相同的 POST 请求 浏览器。

    【讨论】:

    • 对不起,我忘了放我的entry.html,我想在我的入口页面上通过GET提交链接,有什么方法可以做到吗?还是必须通过 POST?
    • @Brunol55:HTTP 标准规定 GET 请求不允许有副作用。所以编辑数据库中的条目通常应该使用 POST/PATCH/PUT/...
    • 但它必须通过 POST,或者最好是通过 POST,但我无法理解的是为什么它不接受此路径上的条目(“wiki/edit//", views.edit, name="edit") 但它接受我的入口路径 path("wiki/", views.entry, name="entry"),我只是想要更好地理解这一点。
    • @Brunol55:它是必需的 (softwareengineering.stackexchange.com/a/188861/166310)。这也是不安全的,因为互联网爬虫发出 GET 请求,因此可能“意外”编辑/删除/...一个条目。此外,对于 GET 请求,Django 不会执行 CSRF 验证。
    • 我想我没有解释自己或者我们正在谈论问题的不同部分,我的 edit.html 有一个表单,它有一个用于编辑条目的 POST 方法,
      它缺少一个 entry=entry ,这没问题,我怀疑这个按钮上的 entry.html 编辑条目 此按钮应通过 GET 将用户带到编辑页面,然后在编辑页面中用户应编辑条目并通过 POST 发送数据,然后它会更新数据库。
    猜你喜欢
    • 2020-11-26
    • 2019-02-07
    • 2019-11-18
    • 2022-01-17
    • 2021-10-27
    • 1970-01-01
    • 2021-12-12
    • 2020-05-13
    • 2021-08-10
    相关资源
    最近更新 更多