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, utilisez un objet, pas un nom. Un site de bibliothèque affiche 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"), échoue avec ValueError. Pour faire correspondre le nom de l’auteur, ajoutez deux traits de soulignement à la clé : filter(author__name="Ursula K. Le Guin").
Ici, l’objet à comparer est le visiteur, il n’y a donc personne à rechercher. Django ajoute déjà l’utilisateur connecté à chaque requête. Ne récupérez jamais l’utilisateur depuis l’URL ou un champ de formulaire, car n’importe qui peut les modifier.
Défi
FacileDans note_list, affichez uniquement les notes de l’utilisateur connecté.
Connectez-vous en tant que ada (mot de passe coddy-pass-123) : la liste affiche Shopping list et Ideas, et non Bob's diary.
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})
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
3Vos propres données
Une note a un propriétaireUniquement mes notesEntraînez-vous par vous-même : Playground Django