Menu
CoddyTech

Tautan Publik

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

Catatan yang dibagikan memerlukan alamat yang bisa dibuka siapa saja, baik sudah login maupun belum, yang menampilkan catatan itu saja. Halaman pemilik memiliki tombol Edit dan Delete, halaman ini tidak boleh memilikinya.

Kamu sudah menggunakan semua bagian ini. Ajukan pertanyaan yang sudah kamu jawab sebelumnya: di situs privat, siapa yang boleh membuka halaman ini? Catatan mana yang boleh ditemukan, dan apa responsnya untuk catatan lainnya? Template mana yang harus digunakan agar halaman ini tidak bisa menautkan ke Edit dan Delete? Tautan hanya aman untuk dibagikan jika server memeriksanya di setiap permintaan.

Uji halaman ini sebagai tiga orang: pemilik, pengguna lain, dan pengunjung yang sudah logout.

challenge icon

Tantangan

Sedang
  • Halaman publik di /shared/<id>/, bernama shared, yang bisa dibuka siapa saja. Halaman ini menampilkan judul dan isi catatan yang dibagikan, serta Shared by dengan nama pengguna pemiliknya.
  • Catatan pribadi menampilkan 404 di halaman tersebut untuk siapa pun.
  • Tidak ada tautan Edit atau Delete di halaman itu.
  • Di halaman catatan yang dibagikan, terdapat tautan Share link ke halaman tersebut.

Tekan Jalankan, keluar, lalu buka /shared/2/.

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


def profile(request):
    note_count = request.user.notes.count()
    return render(request, "notes/profile.html", {"note_count": note_count})
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pengguna dan Akun

Latihan sendiri: Playground Django