Request.user.is_authenticated не работает после изменения урлов
So my code looked like this at first:
views.py
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('login/', views.loginPage, name="login"),
path('logout/', views.logoutUser, name="logout"),
path('', views.home, name='home'),
path('view_data/<str:pk>/', views.view_data, name = "view_data"),
path('edit_data/<str:pk>/', views.edit_data, name = "edit_data"),
path('host/', views.my_form, name='my_form'),
path('delete/<str:pk>/', views.delete_data, name='delete_data')
]
login_register.html
{% extends 'main.html' %}
{% block content %}
<div>
<form method="POST" action="">
{% csrf_token %}
<label>Username:</label>
<input type="text" name="username" placeholder="Enter Username" />
<label>Password:</label>
<input type="password" name="password" placeholder="Enter Password">
<input type="submit" value="login">
</form>
</div>
{% endblock content %}
Я хотел изменить систему аутентификации таким образом, чтобы домашний вид отображался только в том случае, если пользователь вошел в систему. Я смог показать домашний вид после того, как пользователь вошел в систему, внеся небольшие изменения в urls.py и login_register.html следующим образом:
views.py
from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import Information
from django.db.models import Q
from django.contrib import messages
from django.contrib.auth import authenticate, login, logout
from .forms import MyForm
# rooms = [
# {'id': 1, 'name': 'Lets learn python!'},
# {'id': 2, 'name': 'Design with me'},
# {'id': 3, 'name': 'Frontend developers'},
# ]
def home(request):
q = request.GET.get('q') if request.GET.get('q') !=None else ''
information_search = Information.objects.filter(
Q(host__icontains=q) |
Q(hostname__icontains=q) |
Q(port__icontains=q) |
Q(platform__icontains=q) |
Q(username__icontains=q) |
Q(password__icontains=q) |
Q(groups__icontains=q)
)
sort_info = []
informations = Information.objects.all()
for i in informations:
if i.groups not in sort_info:
device_group = i.groups
sort_info.append(device_group)
information_count=information_search.count()
context = {'informations':informations, 'information_search':information_search, 'information_count':information_count, 'sort_info':sort_info}
return render(request, 'polls/home.html', context)
def view_data(request, pk):
information = Information.objects.get(id=pk)
context = {'information':information}
return render(request, 'polls/view_data.html', context)
def loginPage(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
try:
user = User.objects.get(username=username)
except:
messages.error(request, 'User does not exist')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('home')
else:
messages.error(request, "Username or password does not exist")
context = {}
return render(request, 'polls/login_register.html', context)
def logoutUser(request):
logout(request)
return redirect('home')
def edit_data(request, pk):
information = Information.objects.get(id=pk)
form = MyForm(instance=information)
if request.method == 'POST':
form = MyForm(request.POST, instance=information)
if form.is_valid():
form.save()
return redirect('home')
context = {'form': form}
return render(request, 'polls/room_form.html', context)
def delete_data(request, pk):
information = Information.objects.get(id=pk)
if request.method == 'POST':
information.delete()
return redirect('home')
return render(request, 'polls/delete.html', {'obj': information})
def my_form(request):
if request.method == "POST":
form = MyForm(request.POST)
if form.is_valid():
form.save()
return redirect('home')
else:
form = MyForm()
return render(request, 'polls/room_form.html', {'form': form})
login_register.html
{% extends 'main.html' %}
{% block content %}
<div>
<form method="POST" action="home/">
{% csrf_token %}
<label>Username:</label>
<input type="text" name="username" placeholder="Enter Username" />
<label>Password:</label>
<input type="password" name="password" placeholder="Enter Password">
<input type="submit" value="login">
</form>
</div>
{% endblock content %}
Однако панель в navbar.html, которая показывает опцию выхода из системы, если пользователь вошел в систему, перестает работать...
navbar.html
{% extends 'main.html' %}
{% block content %}
<div>
<form method="POST" action="home/">
{% csrf_token %}
<label>Username:</label>
<input type="text" name="username" placeholder="Enter Username" />
<label>Password:</label>
<input type="password" name="password" placeholder="Enter Password">
<input type="submit" value="login">
</form>
</div>
{% endblock content %}
navbar включен в файл main.html следующим образом:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>StudyBud</title>
</head>
<body>
{% include 'navbar.html' %}
{% block content %}
{% endblock %}
</body>
</html>
и main.html расширяется другими шаблонами. Здесь main.html и navbar.html хранятся в папке templates корневого каталога, а другие шаблоны - в папке приложения 'polls'.
Если это поможет, вот мои другие файлы.
models.py
from django.db import models
from django.contrib.auth.models import User
class Information(models.Model):
host = models.CharField(max_length=200, null=True, blank=False)
hostname = models.CharField(max_length=200, null=True, blank=False)
port = models.IntegerField()
platform = models.CharField(max_length=200, null=True, blank=False)
username = models.CharField(max_length=200, null=True, blank=False)
password = models.CharField(max_length=200, null=True, blank=False)
groups = models.CharField(max_length=200, null=True, blank=False)
def __str__(self):
return self.host
Вот home.html, который расширяет main.html и должен показывать полосу выхода из системы.
{% extends 'main.html' %}
{% block content %}
<h2>Inventory Management</h2>
<style>
.home-container{
display: grid;
grid-template-columns: 1fr 3fr;
}
</style>
<div class="home-container">
<div>
<h3>Browse Groups</h3>
<hr>
{% for i in sort_info %}
<div>
<a href="{% url 'home' %}?q={{i}}">{{i}}</a>
<br><br>
</div>
{% endfor %}
</div>
<div>
<h5>{{information_count}} devices registered</h5>
<hr>
<a href="{% url 'my_form' %}"> Add Device </a>
<hr>
{% for information in information_search %}
<span>@{{information.host}}</span>
<h3><a href="{% url 'view_data' information.id %}"> view </a></h3>
<a href="{% url 'edit_data' information.id %}">Edit</a>
<a href="{% url 'delete_data' information.id %}">Delete</a>
<hr>
{% endfor %}
</div>
</div>
{% endblock content %}
</div>
Помогите, пожалуйста, разобраться? Я новичок, и я пытался внести изменения и реализовать свои собственные функции в коде, которому я следовал через учебник.
Похоже, что вы пытаетесь проверить, аутентифицирован ли пользователь в функции представления, что не является хорошим способом обработки аутентификации. Вместо этого вам следует использовать промежуточное ПО аутентификации Django для обработки аутентификации и использовать декоратор @login_required для ограничения доступа к представлениям, требующим аутентификации.
Вот пример использования декоратора @login_required:
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
# Code for the view goes here
В данном примере функция my_view будет доступна только для аутентифицированных пользователей. Если пользователь не аутентифицирован, он будет перенаправлен на страницу входа в систему.
Вы также должны проверить настройки LOGIN_URL и LOGIN_REDIRECT_URL в settings.py, чтобы убедиться в их правильности. Если вы используете пользовательскую модель пользователя, убедитесь, что в переменной AUTH_USER_MODEL установлен правильный путь к модели в settings.py