为用户自定义 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>[^/]+)$']

我错过了什么吗?

对于,你不能使用这样的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'),

如果您正在使用 ,您可能想像现在一样使用 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 有一个额外的参数 usernameLOGIN_REDIRECT_URL 找不到它,因此发生错误。

从 settings.py 中删除 LOGIN_REDIRECT_URL,它应该可以如您所愿地工作。