【问题标题】:How to solve NoReverseMatch, no arguments not found? (Django)如何解决 NoReverseMatch,找不到参数? (姜戈)
【发布时间】: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&lt;page&gt;[^/]+)$']

指定:我正在建立一个类似维基百科的网站,现在想要允许编辑功能。因此我包括了

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 错误。

标签: python django


【解决方案1】:

据我了解,您没有在上下文中传递页面,而是将其命名为标题,因此页面在您的 url 模板标签中没有任何价值

return render(request, "encyclopedia/edit.html", {
        "form_newpage": NewPageForm(initial={'content': util.get_entry(page), 'title': page}),
        "form_searchwiki": SearchWikiForm()
    })

【讨论】:

    猜你喜欢
    • 2018-04-21
    • 1970-01-01
    • 2021-03-05
    • 2017-02-08
    • 2020-08-17
    • 2017-01-14
    • 1970-01-01
    • 2015-07-18
    • 2020-04-18
    相关资源
    最近更新 更多