Menu
CoddyTech

Uniquement mes notes

Fait partie de la section Utilisateurs et comptes du Journey Django de Coddy. Leçon 9 sur 16.

Chaque note a un propriétaire, mais la liste affiche toujours Note.objects.all() : ada lit le journal de bob. La liste ne devrait afficher que les notes de la personne qui en fait la demande.

Pour filtrer sur une ForeignKey, utilise un objet, pas un nom. Un site de bibliothèque répertorie les livres d'un auteur :

author = Author.objects.get(name="Ursula K. Le Guin")
books = Book.objects.filter(author=author)

Django compare l'identifiant de l'auteur. Passer le nom, filter(author="Ursula K. Le Guin"), provoque une ValueError.

Lorsque la ligne à comparer est celle du visiteur, personne n'a besoin d'être recherché : Django a déjà ajouté l'utilisateur connecté à chaque requête, sous forme d'objet, à partir de la session. Ne récupère jamais l'utilisateur depuis l'URL ou un champ de formulaire, car n'importe qui peut le modifier.

challenge icon

Défi

Facile

Dans note_list, affiche uniquement les notes de l’utilisateur connecté.

Clique sur Run et connecte-toi en tant que ada, puis déconnecte-toi et connecte-toi en tant que bob (tous deux utilisent coddy-pass-123). Chacun ne voit que ses propres notes.

Essayez vous-même

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})
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Utilisateurs et comptes

Entraînez-vous par vous-même : Playground Django