Пользовательский Django URL для пользователей - PullRequest
0 голосов
/ 26 февраля 2020

Привет. Я пытался создать URL-адрес клиента для своих пользователей, но он не работает. Я продолжаю получать NoReverseMatchError

Это мой user_login views.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})

Это моя форма для входа в систему при входе в систему. html

<form method="POST" action="{%url 'main:home' user.username %}" class="form-signin">

Это мой view "home"

def home(request, username):
    username = request.user.get_username()
    return render(request,'home.html')

Это мой URL-адрес в myapp / urls.py

path('home/<username>', views.home, name='home'),

Это LOGIN_REDIRECT_URL

LOGIN_REDIRECT_URL = '/main/home'

Я пытаюсь get mysite.com/home/myusername, но он дает мне ошибку NoReverseMarch

Ошибка:

NoReverseMatch at /main/
Reverse for 'home' with arguments '('',)' not found. 1 pattern(s) tried: ['main/home/(?P<username>[^/]+)$']

Я что-то упустил?

Ответы [ 3 ]

0 голосов
/ 26 февраля 2020

Попробуйте использовать slug для имен пользователей. Потому что когда в имени пользователя есть пробел между словами, URL разбивается на две части. Слизень заменит пробел на -.

например, имя пользователя Джон Мэтью, django будет искать home/john вместо home/john mathew. если вы используете slug для имени пользователя, оно будет отправлять имя пользователя как это home/john-mathew .... Попробуйте это

0 голосов
/ 26 февраля 2020

Проблема с LOGIN_REDIRECT_URL и созданными вами URL.

согласно

LOGIN_REDIRECT_URL = '/main/home'

после входа в систему, пользователь перенаправляется на /main/home. К сожалению, в вашей декларации URL такого пути нет. Вместо этого, ваш "домашний" URL в urls.py имеет дополнительный параметр username, который не найден LOGIN_REDIRECT_URL, поэтому возникает ошибка.

удаляет LOGIN_REDIRECT_URL из settings.py и он должен работать, как вы хотите.

0 голосов
/ 26 февраля 2020

Для вы не можете использовать такие path(..) s, и в этом случае вам нужно написать регулярное выражение , например:

    <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'),
...