带有参数的URL上的Django NoReverseMatch

2024-09-19 23:32:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用一个非常简单的表单视图时遇到了一些问题,它将一个值发布到重定向视图中。两种观点都是独立的。只有这个视图在表单提交时失败。你知道吗

视图.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)

表单.py

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

应用程序/网址.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'),
]

项目/网址.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]+)\\/$']

我真的不知道这到底是怎么回事。我做过比这复杂得多的表格。>;<;我在这里明显遗漏了什么?你知道吗


Tags: pathdjangonameinpynetvarwebsite
2条回答

您尚未演示如何在项目的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'),
]

相关问题 更多 >