Как получить Django / Wagtail для разрешения этого URL - PullRequest
0 голосов
/ 05 апреля 2020

Я чувствую себя подобно пятке, спрашивая это, потому что я уверен, что ответ прост. Тем не менее я потратил часы на изучение и тестирование возможных решений и остался безволосым.

В проекте гармония Я написал свою собственную страницу входа, и она находится в приложении под названием users .

У меня есть другое приложение под названием your_harmony . Чтобы выйти за пределы страницы your_harmony, пользователям необходимо войти в систему.

your_harmony. html

    {% if user.is_authenticated %}
        <h1>{{ self.sub_title|richtext }}</h1>
        You are logged in as: {{ user.username }} &nbsp
                <a href="/users/logout">Click here to logout</a>
        ...
    {% else %}
         You must login to access this page. <a href="/users/login">Click here to login</a>
    {% endif %}

harmony.urls

urlpatterns = [
   ...
    url(r'your-harmony/', include('your_harmony.urls')),
    url(r'^users/', include('users.urls')),
   ...

your_harmony.urls

urlpatterns = [
    path('', views.your_harmony, name='your_harmony')
]

URL / users / login использует users / views.py для отображения форма входа

views.py

RETURN_FROM_LOGIN_URL = 'your-harmony'
RETURN_FROM_LOGIN_URL = 'your_harmony/your_harmony.html'

def login_view(request):
    form_context = {'login_form': LoginForm,}
    url = "users/login.html"
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                url = RETURN_FROM_LOGIN_URL
            else:
                messages.error(request, 'Your account is not enabled!')
            context = {}
        else:
            messages.error(request, 'Your username or password was not recognized!')
            context = form_context
    else:
        context = form_context
    return render(request, url, context)

, если я вернусь к 'your-harmony' , получит ошибку

TemplateDoesNotExist в / users / login /

your-harmony

Если я вернусь к your_harmony / your_harmony. html ' Я получу страницы, но без контекста.

Как мне отсортировать это?

1 Ответ

1 голос
/ 12 апреля 2020

Следуя совету @ gasman, я снова посетил Django Tutorials. Как указано в Tutorial Part 4 :

, вы всегда должны возвращать HttpResponseRedirect после успешной обработки данных POST. Этот совет не указан c для Django; в целом это хорошая практика веб-разработки

Поэтому я изменил код для включения этого возврата и заменил путь к шаблону URL-адресом conf.

views.py

RETURN_FROM_LOGIN_URL = 'your_harmony'

def login_view(request):
    form_context = {'login_form': LoginForm,}
    url = "users/login.html"
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect(reverse(RETURN_FROM_LOGIN_URL))
            else:
                messages.error(request, 'Your account is not enabled!')
            context = {}
        else:
            messages.error(request, 'Your username or password was not recognized!')
            context = form_context
    else:
        context = form_context
    return render(request, url, context)

Многому научился и стоит усилий

...