为用户自定义 Django url
Custom Django url for users
您好,我一直在尝试为我的用户创建客户 url,但它不起作用。我不断收到 NoReverseMatchError
这是我的user_loginviews.py
def user_login(request):
'''
Using different method for getting username, tried this and didnt work either
'''
#if request.user.is_authenticated():
#return HttpResponseRedirect('main:home')
if request.method == 'POST':
form = AuthenticationForm(request, data=request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(username=username, password=password)
if user is not None:
login(request,user)
messages.info(request, "Successfully signed in")
return HttpResponseRedirect('home')
#return HttpResponseRedirect(reverse('main:home', kwargs={'username': username}))
else:
message = 'Sorry, the username or password you entered is not valid please try again.'
return render(request, 'login.html', {'message':message})
else:
message = 'Sorry, the username or password you entered is not valid please try again.'
return render(request, 'login.html', {'message':message})
这是我在 login.html
的登录表单
<form method="POST" action="{%url 'main:home' user.username %}" class="form-signin">
这是我的看法"home"
def home(request, username):
username = request.user.get_username()
return render(request,'home.html')
这是我在 myapp/urls.py
的 url 路径
path('home/<username>', views.home, name='home'),
这是LOGIN_REDIRECT_URL
LOGIN_REDIRECT_URL = '/main/home'
我正在尝试获取我的网站。com/home/myusername,但它给我一个 NoReverseMarch 错误
错误:
NoReverseMatch at /main/
Reverse for 'home' with arguments '('',)' not found. 1 pattern(s) tried: ['main/home/(?P<username>[^/]+)$']
我错过了什么吗?
对于django-1.x,你不能使用这样的path(..)
,那样的话你需要写一个正则表达式,比如:
<b>url</b>(<b>r</b>'<b>^</b>complete/<b>(?P</b><todo_id><b>[0-9]+)</b><b>$</b>', views.completeTodo, name='complete'),
如果您正在使用 django-2.x,您可能想像现在一样使用 path(..)
。
我相信这可能与您设置正则表达式的方式有关。
对于 url,而不是这样:
url('complete/<todo_id>', views.completeTodo, name='complete'),
试试这个:
url(r'^complete/(?P<todo_id>\d+)$', views.completeTodo, name='complete'),
或者如果您想使用 [path
]
path('complete/<int:todo_id>', views.completeTodo, name='complete'),
尝试使用 slug 作为用户名。因为当用户名在单词之间有 space 时,URL 分成两部分。 Slug 会将 space 替换为 -。
例如用户名是 John Mathew ,django 将搜索 home/john
而不是 home/john mathew
。如果您使用 slug 作为用户名,它会像这样发送用户名 home/john-mathew
...试试
问题出在您创建的 LOGIN_REDIRECT_URL
和 URL 上。
根据
LOGIN_REDIRECT_URL = '/main/home'
登录后,用户被重定向到 /main/home
。
不幸的是,您的 URL 声明中不存在这样的路径。
相反,urls.py 中的 "home" URL 有一个额外的参数 username
,LOGIN_REDIRECT_URL
找不到它,因此发生错误。
从 settings.py 中删除 LOGIN_REDIRECT_URL
,它应该可以如您所愿地工作。
您好,我一直在尝试为我的用户创建客户 url,但它不起作用。我不断收到 NoReverseMatchError
这是我的user_loginviews.py
def user_login(request):
'''
Using different method for getting username, tried this and didnt work either
'''
#if request.user.is_authenticated():
#return HttpResponseRedirect('main:home')
if request.method == 'POST':
form = AuthenticationForm(request, data=request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(username=username, password=password)
if user is not None:
login(request,user)
messages.info(request, "Successfully signed in")
return HttpResponseRedirect('home')
#return HttpResponseRedirect(reverse('main:home', kwargs={'username': username}))
else:
message = 'Sorry, the username or password you entered is not valid please try again.'
return render(request, 'login.html', {'message':message})
else:
message = 'Sorry, the username or password you entered is not valid please try again.'
return render(request, 'login.html', {'message':message})
这是我在 login.html
的登录表单<form method="POST" action="{%url 'main:home' user.username %}" class="form-signin">
这是我的看法"home"
def home(request, username):
username = request.user.get_username()
return render(request,'home.html')
这是我在 myapp/urls.py
的 url 路径path('home/<username>', views.home, name='home'),
这是LOGIN_REDIRECT_URL
LOGIN_REDIRECT_URL = '/main/home'
我正在尝试获取我的网站。com/home/myusername,但它给我一个 NoReverseMarch 错误
错误:
NoReverseMatch at /main/
Reverse for 'home' with arguments '('',)' not found. 1 pattern(s) tried: ['main/home/(?P<username>[^/]+)$']
我错过了什么吗?
对于django-1.x,你不能使用这样的path(..)
,那样的话你需要写一个正则表达式,比如:
<b>url</b>(<b>r</b>'<b>^</b>complete/<b>(?P</b><todo_id><b>[0-9]+)</b><b>$</b>', views.completeTodo, name='complete'),
如果您正在使用 django-2.x,您可能想像现在一样使用 path(..)
。
我相信这可能与您设置正则表达式的方式有关。
对于 url,而不是这样:
url('complete/<todo_id>', views.completeTodo, name='complete'),
试试这个:
url(r'^complete/(?P<todo_id>\d+)$', views.completeTodo, name='complete'),
或者如果您想使用 [path
]
path('complete/<int:todo_id>', views.completeTodo, name='complete'),
尝试使用 slug 作为用户名。因为当用户名在单词之间有 space 时,URL 分成两部分。 Slug 会将 space 替换为 -。
例如用户名是 John Mathew ,django 将搜索 home/john
而不是 home/john mathew
。如果您使用 slug 作为用户名,它会像这样发送用户名 home/john-mathew
...试试
问题出在您创建的 LOGIN_REDIRECT_URL
和 URL 上。
根据
LOGIN_REDIRECT_URL = '/main/home'
登录后,用户被重定向到 /main/home
。
不幸的是,您的 URL 声明中不存在这样的路径。
相反,urls.py 中的 "home" URL 有一个额外的参数 username
,LOGIN_REDIRECT_URL
找不到它,因此发生错误。
从 settings.py 中删除 LOGIN_REDIRECT_URL
,它应该可以如您所愿地工作。