Всем доброго времени суток, уважаемые форумчане!)
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