@an22alt

Как правильно переадресовать юзера на главную страницу после login'а и logout'а в Django?

Всем доброго времени суток, уважаемые форумчане!)
Django начал изучать буквально недавно, пришла мысль сделать простенький блог для начала, где на главной странице сразу будет выводиться список статей из базы, отсортированный по дате (т.е. при переходе по ссылке my_site.ru/ сразу срабатывает вьюха main_views.index, которая в шаблон подгружает все статьи
Решил не делать отдельные страницы для ввода логина и пароля, а сделать это всё в главном шаблоне index.html
Собссно вопрос: как правильно переадресовать юзера на главную страницу после login'а и logout'а в Django?

вот структура проекта:
my_project
|
|--- articles
|
|--- accounts

код my_project/urls.py
from django.contrib import admin
from django.urls import path, include
from . import views as main_views
from django.conf.urls.static import static
from django.conf import settings


urlpatterns = [
    path('', main_views.index),
    path('admin/', admin.site.urls),
    path('articles/', include('articles.urls')),
    path('accounts/', include('accounts.urls')),
]


код accounts/urls.py
from . import views
from django.urls import path

urlpatterns = [
    path('login', views.login), 
    path('logout', views.logout,
]


код accounts/views.py
from django.shortcuts import render, redirect
from django.contrib import auth

def login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(username=username, password=password)
        if user is not None and user.is_active:
            auth.login(request, user)
            context = {'user': user}
            return render(request, 'index.html', context)
        else:
            context = {'user': None}
            return render(request, 'index.html', context)


def logout(request):
    auth.logout(request)
    return render(request, 'index.html')
]


вот кусок шаблона index.html с формой
{% if user.is_authenticated %}
     <div class="user"> Привет, {{ user.get_full_name }}!
         <form action="accounts/logout" method="post"> {% csrf_token %}
              <input type="submit" value="Выйти" />
         </form>
    </div>
{% else %}
   {% if form.errors %}
         <p class="error">Сожалеем, вы неправильно ввели логин или пароль</p>
   {% endif %}
   <form action="accounts/login" method="post">{% csrf_token %}
       <label for="username">Логин:</label>
       <input type="text" name="username" value="" id="username">
       <label for="password">Пароль:</label>
       <input type="password" name="password" value="" id="password">

       <input type="submit" value="login" />
       <input type="hidden" name="next" value="{{ next }}" />
    </form>
{%  endif %}


при авторизации пользователя перекидывает на главную страницу, что и логично, ведь я рендерю главный шаблон и при этом статьи не отображаются, что тоже вроде как очевидно, ведь не вызывается нужная вьюха) так вот как её правильно вызвать? можно подключить в accounts/views.py вьюху index из my_project/views.py, но чую одним местом, что это не комльфо ибо создаются перекрестные связи, а это не гибко))

и еще.... после того как пользователь решил разлогиниться и кликает на кнопку выхода вообще выдается ошибка
Page not found (404)
Request Method:	POST
Request URL:	http://127.0.0.1:8000/accounts/accounts/logout

вот тут я вообще не могу понять почему так... почему обращение идёт 2 раза к accounts
  • Вопрос задан
  • 1050 просмотров
Пригласить эксперта
Ответы на вопрос 1
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
Используйте в шаблонах тег url, а в login/logout возвращайте ответ с redirect
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы