Solo mis notas
Parte de la sección Usuarios y cuentas del Journey de Django de Coddy. Lección 9 de 16.
Cada nota tiene un propietario, pero la lista sigue mostrando Note.objects.all(): ada lee el diario de bob. La lista debería mostrar solo las notas de quien la está consultando.
Filtra por una ForeignKey con un objeto, no con un nombre. El sitio de una biblioteca muestra los libros de un autor:
author = Author.objects.get(name="Ursula K. Le Guin")
books = Book.objects.filter(author=author)Django compara el id del autor. Pasar el nombre, filter(author="Ursula K. Le Guin"), produce un error ValueError. Para filtrar por el nombre del autor, añade dos guiones bajos a la clave: filter(author__name="Ursula K. Le Guin").
En este caso, el objeto con el que hay que comparar es el visitante, así que no hay que buscar a nadie. Django ya incluye al usuario que ha iniciado sesión en cada solicitud. Nunca obtengas el usuario de la URL ni de un campo del formulario, porque cualquiera puede cambiarlos.
Desafío
FácilEn note_list, muestra solo las notas del usuario que ha iniciado sesión.
Inicia sesión como ada (contraseña coddy-pass-123): la lista muestra Shopping list e Ideas, no Bob's diary.
Pruébalo tú mismo
from django.contrib.auth import login
from django.contrib.auth.decorators import login_not_required
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import get_object_or_404, redirect, render
from .forms import NoteForm
from .models import Note
def note_list(request):
notes = Note.objects.all()
return render(request, "notes/note_list.html", {"notes": notes})
def note_detail(request, pk):
note = get_object_or_404(Note, pk=pk)
return render(request, "notes/note_detail.html", {"note": note})
def note_create(request):
if request.method == "POST":
form = NoteForm(request.POST)
if form.is_valid():
note = form.save(commit=False)
note.owner = request.user
note.save()
return redirect("notes:detail", pk=note.pk)
else:
form = NoteForm()
return render(request, "notes/note_form.html", {"form": form})
def note_edit(request, pk):
note = get_object_or_404(Note, pk=pk)
if request.method == "POST":
form = NoteForm(request.POST, instance=note)
if form.is_valid():
form.save()
return redirect("notes:detail", pk=note.pk)
else:
form = NoteForm(instance=note)
return render(request, "notes/note_form.html", {"form": form, "note": note})
def note_delete(request, pk):
note = get_object_or_404(Note, pk=pk)
if request.method == "POST":
note.delete()
return redirect("notes:list")
return render(request, "notes/note_confirm_delete.html", {"note": note})
@login_not_required
def signup(request):
if request.method == "POST":
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect("notes:list")
else:
form = UserCreationForm()
return render(request, "notes/signup.html", {"form": form})
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Usuarios y cuentas
3Tus propios datos
Una nota tiene un propietarioSolo mis notasPractica por tu cuenta: Playground de Django