Estoy trabajando en un sistema de gestión de facturas en el que el usuario puede agregar datos de factura y se guardará en la base de datos y cada vez que el usuario inicie sesión, los datos aparecerán en la página de inicio, pero cada vez que el usuario cierre la sesión e intente acceder a la página de inicio, pero está dando el siguiente error.
TypeError at / 'AnonymousUser' object is not iterable Probé el método AnonymousUser.is_authenticated pero aún no funciona.
quiero que si el usuario ha iniciado sesión, home.html debería abrirse, de lo contrario intro.html
aquí está mi código views.py
from django.shortcuts import render from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.views.generic import ( ListView, DetailView, CreateView, UpdateView, DeleteView ) from .models import Invoicelist def home(request): if request.user.is_authenticated(): context = { 'invoices': Invoicelist.objects.all() } return render(request, 'invoicedata/home.html', context) else: return render(request, 'invoicedata/intro.html', context)inicio.html
{% extends "invoicedata/base.html" %} {% block content %} {% for invoice in invoices %} <article class="media content-section"> <div class="media-body"> <div class="article-metadata"> <small class="text-muted">{{ invoice.date_posted|date:"F d, Y" }}</small> <h2><a class="article-title" href="{% url 'invoice-detail' invoice.id %}">{{ invoice.issuer }}</a></h2> </div> <p class="article-content">{{ invoice.invoice_number }}</p> <p class="article-content">{{ invoice.date }}</p> <p class="article-content">{{ invoice.amount }}</p> <p class="article-content">{{ invoice.currency }}</p> <p class="article-content">{{ invoice.other }}</p> <div class="article-metadata"> <small class="text-muted">{{ invoice.author }}</small> </div> </div> </article> {% endfor %} {% endblock content %}intro.html
{% extends "invoicedata/base.html" %} {% block content %} <h2>login to your portal for great auditing services</h2> {% endblock content %}Finalmente obtuve la solución que me funcionó.
aquí está
Django proporciona LoginRequiredMixin , usé esto en mi función de vista de lista de facturas
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin class InvoiceListView(LoginRequiredMixin,ListView): model = Invoicelist template_name = 'invoicedata/home.html' context_object_name = 'invoices' def get_queryset(self): return self.model.objects.all().filter(author=self.request.user).order_by('-date_posted')[:2]y eso es. Ahora, cada vez que el usuario cierre la sesión, se redirigirá a la página de inicio de sesión
Sé que la pregunta ya fue respondida, solo quiero hacer un resumen de cada método para ocultar/mostrar información a usuarios no autenticados.
1. Iniciar sesión decorador requerido
Si se trata de una vista funcional, puede decorarla así:
from django.contrib.auth.decorators import login_required @login_required def my_view(request): passEsto solo mostrará la vista a los usuarios autenticados. Si son anónimos, serán redirigidos a la URL de inicio de sesión (settings.LOGIN_URL)
2. LoginRequiredMixin
from django.contrib.auth.mixins import LoginRequiredMixin class MyView(LoginRequiredMixin, View): login_url = '/login/' redirect_field_name = 'redirect_to'Esto es para vistas basadas en clases. De la documentación de Django:
Si una vista usa este mixin, todas las solicitudes de usuarios no autenticados se redirigirán a la página de inicio de sesión o se mostrará un error HTTP 403 prohibido, según el parámetro raise_exception.
Al igual que el método anterior, puede personalizar login_url y redirect_field_name
3. Decorador de métodos de vista basado en clases
from django.utils.decorators import method_decorator class ProtectedView(TemplateView): template_name = 'secret.html' @method_decorator(login_required) def dispatch(self, *args, **kwargs): return super().dispatch(*args, **kwargs)4. Plantillas HTML
Por último, si solo desea ocultar algún bloque HTML específico para usuarios no autenticados, puede envolverlo así:
{% if user.is_authenticated %} <p> Hidden content! </p> <!-- You can also access the user data like this --> <p> {{ {{ request.user }} }} </p> {% endif %}En el contexto HTML, puede hacer:
{% if user.is_authenticated %} # some arbitary stuff <li class="nav-item"> <a class="nav-link" href="#"><strong>{{ user.username }}</strong></a> </li> {% endif %}y luego en el contexto de python puedes hacer:
from django.contrib.auth.decorators import login_required @login_required function stuff(): ..... donde @login_required debe prefijar cualquier función que solo debe ejecutar un usuario que haya iniciado sesión.
Editar: y para abordar su caso de uso específico, solo desea hacer:
if request.user.is_authenticated: .