【问题标题】:Django error "Reverse for 'x' not found. 'x' is not a valid view function or pattern name.", but x is a pattern nameDjango 错误“未找到 'x' 的反向。'x' 不是有效的视图函数或模式名称。”,但 x 是模式名称
【发布时间】:2019-04-23 14:50:16
【问题描述】:

我一直在使用 Celery 构建一个 Django 应用程序,并且我正在使用 Javascript 使用 URL 轮询本地数据库以获取 Celery 任务的状态。出于某种原因,我的脚本中的 url 模板标签不断出现错误。我做错了什么?

我已经查看了关于 SO 的这个问题的所有变体,它们都归结为坏名声。据我所知,我的名字是正确的,我没有使用任何命名空间。

我的 urls.py

from django.conf.urls import url
from django.contrib.auth import views as auth_views
from django.views.generic.base import RedirectView
from django.urls import path, re_path
from django.conf import settings
from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

import app.views

from django.conf.urls import include
from django.contrib import admin
admin.autodiscover()

urlpatterns = [
    path('signup/', app.views.signup, name='signup'),
    path('resetpassword/', auth_views.PasswordResetView.as_view(
        template_name='registration/resetpassword.html'), name="resetpassword"),
    path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(
        template_name='registration/password_reset_done.html'), name='password_reset_done'),
    path('reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(
        template_name='registration/resetpasswordconfirm.html'), name='password_reset_confirm'),
    path('reset/done/', auth_views.PasswordResetCompleteView.as_view(
        template_name='registration/resetpasswordcomplete.html'), name='password_reset_complete'),

    path('graph', app.views.draw_graph, name='graph'),
    path('upload', app.views.upload, name='upload'),
    path('download', app.views.download_zip),
    path('render', app.views.render_pulses, name='render'),
    path('display', app.views.display_images, name='display'),
    path('render_status', app.views.render_status, name='render-status'),
    path('', app.views.gallery, name='gallery'),

    re_path(r'^(?P<slug>[-\w]+)$', app.views.AlbumDetail.as_view(), name='album'),

    # Auth related urls
    re_path(r'accounts/login/$', auth_views.LoginView.as_view(), name='login'),
    re_path(r'accounts/logout/$', app.views.logout, {'next_page': '/', }, name='logout'),

    # Uncomment the next line to enable the admin:
    path('admin/', admin.site.urls),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

handler404 = 'app.views.handler404'

有问题的 Javascript (layout.html)。

<script type="text/javascript">// <![CDATA[
    function get_status() {
        var urlStatus = '{% url "render-status" %}';
        fetch().then(function(response) {
            response.json().then(function(data) {
                if(data.status) {
                    // show render link
                    // don't forget to hide on click
                }
                else {
                    // show loading gif
                }
            });
        });
        get_status();
// ]]></script>

这一切导致的视图函数

def render_status(request):
    result = db_API.get_render_status(request.user.id)

    return HttpResponse({'status': result}, content_type='application/json')

最后是回溯

Environment:


Request Method: GET
Request URL: https://www.echobatalog.com/

Django Version: 2.2
Python Version: 3.6.7
Installed Applications:
['app',
 'material',
 'material.admin',
 'imagekit',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.sitemaps',
 'django.contrib.sites',
 'django_celery_results']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'whitenoise.middleware.WhiteNoiseMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'material.frontend.middleware.SmoothNavigationMiddleware']


Template error:
In template /home/batalog/batalogvenv/Bat_Echolocation_2019/app/templates/layout.html, error at line 3
   Reverse for 'render-status' not found. 'render-status' is not a valid view function or pattern name.
   1 : <script type="text/javascript">// <![CDATA[
   2 :     function get_status() {
   3 :  var urlStatus = ' {% url "render-status" %} ';
   4 :         fetch(urlStatus).then(function(response) {
   5 :              response.json().then(function(data) {
   6 :                 if(data.status) {
   7 :                     // show render link
   8 :                     // don't forget to hide on click
   9 :                 }
   10 :                 else {
   11 :                     // show loading gif
   12 :                 }
   13 :             });


Traceback:

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/batalog/batalogvenv/Bat_Echolocation_2019/app/views.py" in gallery


File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/shortcuts.py" in render
  36.     content = loader.render_to_string(template_name, context, request, using=using)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/loader.py" in render_to_string
  62.     return template.render(context, request)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/backends/django.py" in render
  61.             return self.template.render(context)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/base.py" in render
  171.                     return self._render(context)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/base.py" in _render
  163.         return self.nodelist.render(context)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/base.py" in render
  937.                 bit = node.render_annotated(context)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/base.py" in render_annotated
  904.             return self.render(context)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/loader_tags.py" in render
  150.             return compiled_parent._render(context)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/base.py" in _render
  163.         return self.nodelist.render(context)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/base.py" in render
  937.                 bit = node.render_annotated(context)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/base.py" in render_annotated
  904.             return self.render(context)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/loader_tags.py" in render
  150.             return compiled_parent._render(context)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/base.py" in _render
  163.         return self.nodelist.render(context)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/base.py" in render
  937.                 bit = node.render_annotated(context)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/base.py" in render_annotated
  904.             return self.render(context)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/template/defaulttags.py" in render
  443.             url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/urls/base.py" in reverse
  90.     return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))

File "/home/batalog/batalogvenv/lib/python3.6/site-packages/django/urls/resolvers.py" in _reverse_with_prefix
  660.         raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /
Exception Value: Reverse for 'render-status' not found. 'render-status' is not a valid view function or pattern name.

我希望它会不断检查我的数据库以了解用户最新工作的状态,但结果却出错了。

【问题讨论】:

  • 这个 url 有命名空间吗? (您是否在主 urls.py 中使用 include 将其添加到路由中?)
  • @Alasdair 更新了帖子
  • @Verbal_Kint 我想我没有
  • 请向我们展示完整的追溯
  • @Verbal_Kint 更新了帖子

标签: python django django-2.0


【解决方案1】:

原来错误是因为 Gunicorn 加载了早期版本的 urls.py。我所做的所有更改都无济于事。为了修复它,我不得不重新启动守护进程。

【讨论】:

    猜你喜欢
    • 2018-11-16
    • 2021-10-23
    • 2019-04-06
    • 2021-04-21
    • 2018-11-19
    • 2018-01-25
    • 2019-06-27
    • 2019-04-21
    • 2021-07-18
    相关资源
    最近更新 更多