Джанго перенаправить пользователя после входа в систему - PullRequest
1 голос
/ 20 сентября 2019

У меня проблема при попытке перенаправить пользователя после входа в систему base.html, который находится в главной папке шаблона.Django не может найти этот шаблон.

Я получаю сообщение об ошибке:

 Django tried these URL patterns, in this order:

 1. admin/
 2.
 The current path, base.html, didn't match any of these.

Как правильно настроить django для работы перенаправления?

Структура Django:

accounts
main_folder
    settings.py
    urls.py
staticfiles
templates
    base.html

Краткая структура приложения

accounts
    templates
        accounts
            login.html
    urls.py
    views.py

settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

accounts urls.py

from django.urls import path
from .views import*

urlpatterns = [
    path('', login_view),

]

account view.py

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.contrib import messages


def login_view(request):
    if request.method == 'POST':
        # get posted data
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        # handle user authentication
        if user is not None and user.is_active and user.is_authenticated:
                login(request, user)
                # move user to main page
                return redirect('base.html')

    return render(request, 'accounts/login.html')

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Ваше перенаправление не на шаблон, а на URL.Таким образом, в вашем текущем коде при успешном входе в систему вы будете перенаправлены на http://localhost/base.html.

. Вам нужно будет изменить перенаправление на путь:

return redirect('/some-url/')

Или лучше использовать именованные URL-адреса..

return redirect('some-named-url')
# this would turn a named url into a url string such as '/auth-url/'

Ваш файл urls будет выглядеть примерно так:

from django.urls import path
from .views import*

urlpatterns = [
    path('', login_view),
    path('auth-url/', <some_view>, name='some-named-url'),
]

Чем лучше, тем более django способ.

Если вы не делаетеЧто-то слишком экстремальное, на что вы действительно должны обратить внимание при использовании встроенной аутентификации djangos.Он не только проверен и протестирован, но также будет исправлен, если когда-нибудь будет обнаружена уязвимость.

Чтобы сделать это, вы должны изменить URL-адреса на что-то вроде:

from django.urls import path
from django.contrib.auth.views import (
    LoginView,
    LogoutView,
)

urlpatterns = [
    path(
        'login/',
        LoginView.as_view(template_name='account/login.html'),
        name='login',
    ),
    path(
        'logged-in/',
        <Your LoginView>,
        name='logged_in',
    ),
    path(
        'logout/',
        LogoutView.as_view(),
        name='logout',
    ),
]

И вваш файл настроек:

LOGIN_URL = 'login' # this is the name of the url

LOGOUT_REDIRECT_URL = 'login' # this is the name of the url

LOGIN_REDIRECT_URL = 'logged_in' # this is the name of the url
0 голосов
/ 20 сентября 2019

Я нашел решение:

изменить view.py

return redirect(home)

добавить в view.py

def home(request):
    return render(request, 'base.html')

и в urls.py

path('home/', home, name='home')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...