Menu
CoddyTech

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 et moins d’aide. D’abord, une page à toi : qui est connecté et combien de notes cette personne a écrites. Tout ce dont tu as besoin se trouve sur l’utilisateur connecté : son nom d’utilisateur et ses notes grâce au related_name du champ du 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 anglais, on écrit 1 book, mais 2 books. Le filtre de modèle pluralize ajoute un s, sauf si le nombre est 1 : book{{ count|pluralize }}. Une autre terminaison se met entre guillemets : box{{ count|pluralize:"es" }}.

challenge icon

Défi

Moyen

Ajoutez une page de profil à /profile/, nommée profile :

  • Un <h1> contenant le nom d’utilisateur.
  • You have 2 notes. avec le propre décompte de l’utilisateur : You have 1 note. pour une note, You have 0 notes. pour aucune note.
  • Dans l’en-tête, après Signed in as ..., un lien Profile vers cette page.

Cliquez sur Run et ouvrez /profile/ en tant que ada, puis en tant que bob (mot de passe coddy-pass-123).

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