Menu
CoddyTech

Halaman Profil

Termasuk bagian Pengguna dan Akun dalam perjalanan Django di Coddy. Pelajaran 14 dari 16.

Di bab ini, kamu menambahkan fitur dengan pengetahuanmu dan lebih sedikit bantuan. Pertama, buat halaman sendiri: siapa yang sudah masuk dan berapa banyak catatan yang mereka tulis. Semua yang dibutuhkan ada pada pengguna yang sudah masuk: nama pengguna dan catatan mereka melalui related_name pada field pemilik.

Untuk menampilkan jumlah baris, minta database menghitungnya. Di situs library, author.books.count() menjalankan satu SELECT COUNT(*). len(author.books.all()) menghasilkan jumlah yang sama, tetapi memuat setiap buku terlebih dahulu.

Dalam bahasa Inggris, gunakan 1 book, tetapi 2 books. Filter template pluralize menambahkan s kecuali jumlahnya 1: book{{ count|pluralize }}. Akhiran lain ditulis di dalam tanda kutip: box{{ count|pluralize:"es" }}.

challenge icon

Tantangan

Sedang

Tambahkan halaman profil di /profile/, dengan nama profile:

  • Sebuah <h1> yang menampilkan nama pengguna.
  • You have 2 notes. dengan jumlah catatan milik pengguna tersebut: You have 1 note. untuk satu catatan, You have 0 notes. jika tidak ada.
  • Di header, setelah Signed in as ..., tambahkan tautan Profile menuju halaman tersebut.

Tekan Jalankan dan buka /profile/ sebagai ada, lalu sebagai bob (kata sandi coddy-pass-123).

Coba sendiri

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})

Semua pelajaran di Pengguna dan Akun

Latihan sendiri: Playground Django