Django переопределяет процесс входа в систему django.contrib.auth
views.py
from django.contrib import messages
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from django.contrib.auth.views import LoginView
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
def templates(request):
return render(request, 'templates.html')
def information(request):
return render(request, 'information.html')
def custom_login(request):
if request.POST:
username = request.POST['username']
password = request.POST['password']
user = authenticate(username = username, password = password)
print("work")
if user is not None:
messages.success(request, 'Success')
login(request, user)
return HttpResponse('login')
#logout(request)
else:
messages.error(request, 'Invalid username or password')
print("error")
return HttpResponse('wrong username or password')
class CustomLoginView(LoginView):
print("check")
def form_valid(self):
custom_login(self.request)
urls.py
from django.contrib import admin
from django.urls import path, include
from ArtisticCode import views
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/login/', views.CustomLoginView.as_view(), name='login'),
path('accounts/', include('django.contrib.auth.urls')),
path('', views.index, name = 'index'),
path('templates/', views.templates, name = 'templates'),
path('information/', views.information, name = 'information'),
]
accounts/login.html
<form method="post" class="login">
{% csrf_token %}
<div class="login_input">
<img src="{% static 'img/bx_img1.png' %}" alt="image"/>
<input type="text" placeholder="Username" name="username" required/>
</div>
<div class="login_input">
<img src="{% static 'img/bx_img1.png' %}" alt="image"/>
<input type="password" placeholder="Password" name="password" required/>
</div>
<input type="submit" value="Send message"/>
{% if messages %}
{% for message in messages %}
<strong style="color:white;">{{ message }}</strong>
{% endfor %}
{% endif %}
</form>
Идея состоит в том, чтобы выводить сообщение в случае неправильного пароля, но я не могу правильно поймать метод post. Из того, что я делал последние несколько дней, чтобы попытаться сделать это, я обнаружил, что мне нужно переопределить логин. Я думаю, что функция form_valid - это та, которую мне нужно переопределить, чтобы я мог обрабатывать метод post
setting.py
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.messages',
]
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
]
Решение проблемы - сделать все самому, не используя готовые функции, потому что пароль и имя идут в одно и то же место, независимо от того, пишешь ты его сам или используешь готовый код. Идея с самого начала была в том, что если использовать готовые формы типа form.as _p я не могу смеяться над стилем, то не было возможности поставить уведомление о неправильном пароле, отсюда я пришел к выводу, что лучше всего писать все самому.
изменения: urls.py
from django.contrib import admin
from django.urls import path
from ArtisticCode import views
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/login/', views.login, name='login'),
path('', views.index, name = 'index'),
path('templates/', views.templates, name = 'templates'),
path('information/', views.information, name = 'information'),
]
views.py
from django.contrib import messages
from django.contrib.auth import authenticate, login
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
def templates(request):
return render(request, 'templates.html')
def information(request):
return render(request, 'information.html')
def login(request):
if request.POST:
username = request.POST['username']
password = request.POST['password']
user = authenticate(username = username, password = password)
if user is not None:
messages.success(request, 'Success')
#login ...
else:
messages.error(request, 'Invalid username or password')
return render(request, 'registration/login.html')