Une page de profil
Fait partie de la section Utilisateurs et comptes du Journey Django de Coddy. Leçon 14 sur 16.
Dans ce chapitre, tu ajoutes des fonctionnalités avec ce que tu sais déjà et moins d’aide. D’abord, une page à toi : qui est connecté et combien de notes cette personne a écrites. Tout ce qu’il faut se trouve sur l’utilisateur connecté : le nom d’utilisateur et ses notes grâce au related_name du champ propriétaire.
Pour afficher le nombre de lignes, demande à la base de données de les compter. Sur un site de bibliothèque, author.books.count() exécute un SELECT COUNT(*). len(author.books.all()) donne le même nombre, mais charge d’abord tous les livres.
En français, on écrit 1 livre, mais 2 livres. Comme dans la première section, le filtre pluralize ajoute un s sauf si le nombre est 1 : book{{ count|pluralize }}. Une autre terminaison se met entre guillemets : box{{ count|pluralize:"es" }}.
Défi
MoyenAjoute une page de profil.
- Dans
notes/views.py, écrisprofile: affichenotes/profile.htmlavec le nombre de notes de l’utilisateur. - Dans
notes/urls.py, ajouteprofile/nomméprofile. - Crée
profile.htmlen étendantnotes/base.html. Affiche uniquement le nom d’utilisateur dans un<h1>, puisYou have 2 notes.Utilisepluralizepour que le texte indiqueYou have 1 note.pour une seule note. - Dans
base.html, crée un lien « Profil » vers cette page.
En tant que ada, clique sur Profil : You have 2 notes.
Essayez vous-même
from django.contrib.auth import login
from django.contrib.auth.decorators import login_not_required, permission_required
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied
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, owner=request.user)
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, owner=request.user)
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, owner=request.user)
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})
def stats(request):
if not request.user.is_staff:
raise PermissionDenied
context = {"user_count": User.objects.count(), "note_count": Note.objects.count()}
return render(request, "notes/stats.html", context)
@permission_required("notes.view_note", raise_exception=True)
def all_notes(request):
notes = Note.objects.select_related("owner")
return render(request, "notes/all_notes.html", {"notes": notes})
Toutes les leçons de Utilisateurs et comptes
Entraînez-vous par vous-même : Playground Django