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

Вернуться на верх