【发布时间】:2020-12-22 17:12:39
【问题描述】:
编辑:我能够通过如下修改 view.py 来实现所需的行为
urlpatterns = [
path("", views.index, name="index"),
path("wiki/<str:entry>", views.entry, name="entry"),
path("edit/<str:page>", views.edit, name="edit"),
path("new", views.new, name="new"),
path("edit/CSS", views.edit, name="edit")
]
但是我不知道,为什么会这样!!!???注意:它不仅适用于条目'CSS',还适用于其他条目。
模板编辑.html
{% extends "encyclopedia/layout.html" %}
{% block title %}
Edit
{% endblock %}
{% block body %}
<form action="{% url 'edit' %}" method="POST">
{% csrf_token %}
<table border="1">
{{ form_newpage }}
</table>
<button type="submit">Save Page</button>
</form>
{% endblock %}
我是 Django 新手。我收到以下错误:NoReverseMatch: Reverse for 'edit' with no arguments not found. 1 pattern(s) tried: ['edit/(?P<page>[^/]+)$']
指定:我正在建立一个类似维基百科的网站,现在想要允许编辑功能。因此我包括了
path("edit/<str:page>", views.edit, name="edit"),
在我的百科全书应用程序的 urls.py 中进入我的 urlpatterns。
对于编辑,views.py 看起来像这样:
def edit(request, page):
return render(request, "encyclopedia/edit.html", {
"form_newpage": NewPageForm(initial={'content': util.get_entry(page), 'title': page}),
"form_searchwiki": SearchWikiForm()
})
当我现在尝试访问 http://127.0.0.1:8000/edit/CSS - CSS 是该百科全书的有效条目时 - 我收到 NoReverseMatch 错误。在 Traceback 中,局部变量页面的值是 'CSS',所以我不明白,为什么 Django 不将 'CSS' 识别为 url 中的正确参数。
get_entry 函数:
def get_entry(title):
"""
Retrieves an encyclopedia entry by its title. If no such
entry exists, the function returns None.
"""
try:
f = default_storage.open(f"entries/{title}.md")
return f.read().decode("utf-8")
except FileNotFoundError:
return None
完整追溯:
Traceback (most recent call last):
File "/home/fed/.local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/home/fed/.local/lib/python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/fed/cs/cs50_web/wiki/encyclopedia/views.py", line 59, in edit
return render(request, "encyclopedia/edit.html", {
File "/home/fed/.local/lib/python3.8/site-packages/django/shortcuts.py", line 19, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/loader.py", line 62, in render_to_string
return template.render(context, request)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render
return self.template.render(context)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/base.py", line 170, in render
return self._render(context)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
return self.nodelist.render(context)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/base.py", line 938, in render
bit = node.render_annotated(context)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
return self.render(context)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
return compiled_parent._render(context)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
return self.nodelist.render(context)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/base.py", line 938, in render
bit = node.render_annotated(context)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
return self.render(context)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
result = block.nodelist.render(context)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/base.py", line 938, in render
bit = node.render_annotated(context)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
return self.render(context)
File "/home/fed/.local/lib/python3.8/site-packages/django/template/defaulttags.py", line 446, in render
url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
File "/home/fed/.local/lib/python3.8/site-packages/django/urls/base.py", line 87, in reverse
return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
File "/home/fed/.local/lib/python3.8/site-packages/django/urls/resolvers.py", line 685, in _reverse_with_prefix
raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'edit' with no arguments not found. 1 pattern(s) tried: ['edit/(?P<page>[^/]+)$']
[22/Dec/2020 17:20:16] "GET /edit/CSS HTTP/1.1" 500 153425
我现在尝试的(在views.py中的编辑功能内)是:
return HttpResponse("Hello, world!")
.. 这可以正常工作。
我认为,从我现在所读的内容来看,错误必须在 urls.py 中?!错误基本上是说编辑/ CSS 不匹配,什么时候应该匹配..?!
【问题讨论】:
-
我们可以看看你的
get_entry函数吗? -
是的,我添加了代码。但是,我认为这不应该是错误。
-
以文本形式向我们展示来自 控制台 的完整错误回溯。
-
失败的
reverse来自模板标签。在模板中发布代码;可能是您对{% url %}标签的实现导致了问题。您在encyclopedia/edit.html中实现的url 标签是否通过page参数?请注意,问题是 not 在您的 urls.py 中,因为您的视图实际上可以正确呈现;对此,请参阅您的回溯的第三行或要求我澄清。) -
好的,我包含了模板代码。我知道 {% url 'edit' %} 是“假的”,但不知何故,它现在与我添加的 urls.py 中的最后一个路径结合使用。如果我替换 {% url 'edit' page %},就会再次出现 NoReverseMatch 错误。