【问题标题】:Why is the URL not passing information to my view?为什么 URL 没有将信息传递给我的视图?
【发布时间】:2018-09-09 18:45:15
【问题描述】:

我正在尝试配置 urls.py 以通过 URL 传递信息。

当 url 匹配“requests/”时,我的主 urls.py 文件包含以下 requests/urls.py

完整的请求/urls.py:

from django.urls import path
from django.conf.urls import include, url
from . import views


urlpatterns = [
    path('admin/<id>/', views.RequestQueue),
    url('admin/', views.RequestQueue, name="queue"),
    url('', views.ps_request, name='requests'),
]

来自views.py:

    def RequestQueue(request, id=0):

    #handle updates to request status
    if request.method == "POST":
        request_update = Request.objects.get(pk=id)
        form = RequestComplete(request.POST, instance=request_update)
        form.save()

    pending_requests = Request.objects.filter(status='pending')
    context = {'pending_requests' : pending_requests, 'status_form' : RequestComplete}
    template_name = 'pending-queue.html'
    return render(request, template_name, context)

当我使用以下网址运行开发服务器时:

http://127.0.0.1:8000/requests/admin/10/

“id”的值仍然等于默认值.. 0

不应该更新为网址中数字的值吗?

编辑 - 回溯: 环境:

Request Method: POST
Request URL: http://127.0.0.1:8000/requests/admin/7

Django Version: 2.0.3
Python Version: 3.6.4
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'aboutme',
 'contactme',
 'experience',
 'login',
 'psrequest']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 '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'] 



Traceback:

File "C:\Users\name\PycharmProjects\user\venv\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\Users\name\PycharmProjects\user\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\name\PycharmProjects\user\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\name\python\name\psrequest\views.py" in RequestQueue
  31.         request_update = Request.objects.get(pk=id)

File "C:\Users\name\PycharmProjects\user\venv\lib\site-packages\django\db\models\manager.py" in manager_method
  82.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

    File "C:\Users\name\PycharmProjects\user\venv\lib\site-packages\django\db\models\query.py" in get
  403.                 self.model._meta.object_name

Exception Type: DoesNotExist at /requests/admin/7
Exception Value: Request matching query does not exist.

【问题讨论】:

  • 您的 url 格式不包含 requests/ - 如果您有和 include(),请同时显示。
  • 现在我仔细观察你已经混淆了path()url()。如果您使用的是 Django 2.0,则需要 path('admin/&lt;int:id&gt;/', views.RequestQueue),
  • 我做了其他线程中提到的更改,但看起来我仍然遇到了这个特定代码部分的问题。我看到了 url() 和 path() 之间的区别,但是值仍然没有传递给我的变量。
  • 您如何检查id 的值?在您发布的视图中,您仅在POST 部分中使用它。您的 URL 中的其他地方可能存在问题。请注意,您的 URL 是用于http://127.0.0.1:8000/requests/admin/10/ 尾部斜杠。
  • 我是 Python 新手,我不明白斜杠的重要性。 Traceback 告诉我以下内容: request_update = Request.objects.get(pk=id) local vars -> id -> 0

标签: python django django-forms django-views


【解决方案1】:

您的第一个 URL 模式是:

path('admin/<id>/', views.RequestQueue),

这意味着它只会处理对admin/&lt;id&gt;/ 的请求。尾部斜杠很重要 - 它不会匹配 admin/&lt;id&gt;

下一个问题是您错误地使用了url()。当你使用url()时,它使用的是正则表达式,所以你需要^$来标记字符串的开始和结束。

url('^admin/$', views.RequestQueue, name="queue"),
url('^$', views.ps_request, name='requests'),

由于您使用的是 Django 2.0,所以使用path() 更容易:

path('admin/', views.RequestQueue, name="queue"),
path('', views.ps_request, name='requests'),

因为您使用的是url() 而没有$,所以您对http://127.0.0.1:8000/requests/admin/10/ 的请求由url('admin', ...) URL 模式匹配和处理。这个url() 没有id kwarg,所以视图使用默认的id=0

一旦您解决了这个问题,最后一件事就是更改发布请求,以便将其发送到带有斜杠的 URL。这可能需要更改您的模板。

【讨论】:

  • 非常感谢。我一直在看视频和教程,但我不太明白。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2014-09-21
  • 2021-06-21
  • 2012-03-12
  • 1970-01-01
  • 2016-03-20
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多