簡體   English   中英

帶有參數的URL上的Django NoReverseMatch

[英]Django NoReverseMatch on URL with parameter

我在使用非常簡單的表單視圖(將單個值發布到重定向視圖)中遇到麻煩。 兩種觀點都是自己工作的。 提交表單后,只有該特定視圖失敗。

views.py

def hsk_select(request, username=None):
    template_name = 'tests/hsklevelselect.html'
    if request.method == 'POST':
        form = HskLevelSelectForm(request.POST)
        if form.is_valid():
            level = form.cleaned_data['level']
            return redirect('tests:hsktest', level=level)
    else:
        form = HskLevelSelectForm()
    context = {
        'form': form,
        'username': username,
    }
    return render(request, template_name, context)

forms.py

class HskLevelSelectForm(forms.Form):
    level = forms.ChoiceField(choices=[(x, x) for x in range(1, 7)])

應用程序/ urls.py

from django.urls import path

from . import views

app_name = 'tests'

urlpatterns = [
    path('duolingo/', views.duolingo_test, name='duotest'),
    path('hsk/', views.hsk_select, name='hskselect'),
    path('hsk/<int:level>/', views.hsk_test, name='hsktest'),
]

項目/ urls.py

from django.urls import path

from . import views

app_name = 'main'

urlpatterns = [
    path('', views.enteruser, name='enteruser'),
    path('success/', views.success, name='success'),
    path('<str:username>/', views.home, name='home'),
]

追溯

Environment:


Request Method: POST Request URL:
http://duotool.website.net/username/test/hsk/

Django Version: 2.1.5 Python Version: 3.5.2 Installed Applications:
['rest_framework',  'debug_toolbar',  'django.contrib.admin', 
'django.contrib.auth',  'django.contrib.contenttypes', 
'django.contrib.sessions',  'django.contrib.messages', 
'django.contrib.staticfiles',  'main',  'tests',  'widget_tweaks']
Installed Middleware:
['debug_toolbar.middleware.DebugToolbarMiddleware', 
'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
"/var/www/django/duotool.website.net/venv/lib/python3.5/site-packages/django/core/handlers/exception.py"
in inner
  34.             response = get_response(request)

File
"/var/www/django/duotool.website.net/venv/lib/python3.5/site-packages/django/core/handlers/base.py"
in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File
"/var/www/django/duotool.website.net/venv/lib/python3.5/site-packages/django/core/handlers/base.py"
in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/var/www/django/duotool.website.net/duotool/tests/views.py" in hsk_select
  132.             return redirect('tests:hsktest', level=level)

File
"/var/www/django/duotool.website.net/venv/lib/python3.5/site-packages/django/shortcuts.py"
in redirect
  58.     return redirect_class(resolve_url(to, *args, **kwargs))

File
"/var/www/django/duotool.website.net/venv/lib/python3.5/site-packages/django/shortcuts.py"
in resolve_url
  148.         return reverse(to, args=args, kwargs=kwargs)

File
"/var/www/django/duotool.website.net/venv/lib/python3.5/site-packages/django/urls/base.py"
in reverse
  90.     return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))

File
"/var/www/django/duotool.website.net/venv/lib/python3.5/site-packages/django/urls/resolvers.py"
in _reverse_with_prefix
  622.         raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /username/test/hsk/ Exception Value:
Reverse for 'hsktest' with keyword arguments '{'level': '1'}' not found. 1 pattern(s) tried:
['(?P<username>[^/]+)\\/test\\/hsk\\/(?P<level>[0-9]+)\\/$']

我真的不確定這里到底發生了什么。 我做的表格比這復雜得多。 >。<我在這里很想念什么?

您尚未顯示如何在項目的URL中包含app/urls.py ,但回溯顯示完整的URL模式包括用戶名:

'(?P<username>[^/]+)\\/test\\/hsk\\/(?P<level>[0-9]+)\\/$'

因此,當您反向URL時,需要包括用戶名

redirect('tests:hsktest', username=request.user.username, level=level)

由於該視圖默認使用username=None作為默認值,因此您需要考慮這種情況下的操作。

嘗試這個 :

urlpatterns = [
    path('duolingo/', views.duolingo_test, name='duotest'),
    path('hsk', views.hsk_select, name='hskselect'), # remove slash to distinguish the other url
    path('hsk/<int:level>/', views.hsk_test, name='hsktest'),
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM