Menu
CoddyTech

La nota de otra persona

Parte de la sección Usuarios y cuentas del Journey de Django de Coddy. Lección 10 de 16.

La lista oculta las notas de otras personas, pero las páginas de las notas no. Las notas están numeradas como /1/, /2/, /3/, así que cualquiera puede probar el siguiente número y leerla. No basta con ocultar los enlaces de una lista: cada página tiene que comprobarlo.

get_object_or_404() acepta los mismos criterios de búsqueda que filter(), tantos como quieras, y encuentra una fila solo cuando todos coinciden. Una página de una tienda muestra únicamente los pedidos que siguen abiertos:

order = get_object_or_404(Order, pk=pk, status="open")

Un pedido cerrado responde 404 Página no encontrada allí, la misma respuesta que para un número que no existe. En el caso de una fila privada, eso es intencional: un 403 Prohibido le indicaría a un desconocido que la fila existe.

Order.objects.get() generaría DoesNotExist en su lugar, y el visitante recibiría un 500 Error del servidor: un fallo.

challenge icon

Desafío

Fácil

En note_detail, muestra una nota solo a su propietario. Tanto una nota de otra persona como un número que no existe devuelven 404.

Pulsa Run, inicia sesión como bob (contraseña coddy-pass-123) y abre /1/, una de las notas de ada.

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.filter(owner=request.user)
    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})

Todas las lecciones de Usuarios y cuentas

Practica por tu cuenta: Playground de Django