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 consulta.
Filtra por una ForeignKey usando un objeto, no 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"), provoca un error ValueError.
Cuando la fila con la que se compara corresponde al visitante, no hay que buscar a nadie: Django ya añadió el usuario autenticado a cada solicitud como un objeto, desde la sesión. Nunca obtengas el usuario de la URL ni de un campo de formulario, ya que cualquiera puede cambiarlos.
Desafío
FácilEn note_list, muestra solo las notas del usuario que ha iniciado sesión.
Pulsa Ejecutar e inicia sesión como ada, después cierra sesión e inicia sesión como bob (ambos usan coddy-pass-123). Cada uno ve solo sus propias notas.
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