Menu
CoddyTech

İzin Gerekli

Coddy'nin Django Journey'sinin Kullanıcılar ve Hesaplar bölümünün bir parçası. Ders 13 / 16.

Yeni /all/ sayfası, destek taleplerini ele alan kişiler için tüm kullanıcıların notlarını listeler. is_staff her şey için tek bir anahtardır; bu sayfa daha ince ayarlı bir kural gerektirir.

Her model için migrate dört izin oluşturur: ekleme, değiştirme, silme ve görüntüleme. Her izin, shop.change_product gibi uygulama etiketi ve bir kod adından oluşan bir adla tanımlanır. Bunları yönetici panelindeki kullanıcının sayfasında kullanıcıya veya bir gruba verebilirsiniz. Süper kullanıcının hepsine sahip olur.

Bir dekoratör izinlerden birini denetler:

from django.contrib.auth.decorators import permission_required


@permission_required("shop.change_product", raise_exception=True)
def edit_prices(request):
    ...

raise_exception=True olmadan, izne sahip olmayan bir kullanıcı oturum açmış olsa bile giriş sayfasına gönderilir. Bu seçenekle 403 yanıtı alır. Bir görünümde request.user.has_perm("shop.change_product") aynı denetimi yapar; bir şablonda ise {% if perms.shop.change_product %} kullanılır.

challenge icon

Görev

Orta

Yalnızca destek ekibinin erişebilmesi için /all/ adresini aç.

  1. notes/views.py dosyasında, yalnızca notları görüntüleme için Django’nun yerleşik iznine sahip kullanıcıların all_notes sayfasını açmasına izin ver. Diğerleri giriş sayfası yerine 403 Yasak yanıtı almalı.
  2. base.html dosyasında, İstatistikler bağlantısından sonra, yalnızca bu izne sahip kullanıcılara gösterilen ve /all/ adresine giden bir All notes bağlantısı ekle.

carol olarak /all/ adresini aç: üç notun tamamı listelenir. bob olarak aç: 403 Yasak yanıtı alırsın. Parola: coddy-pass-123.

Kendin dene

from django.contrib.auth import login
from django.contrib.auth.decorators import login_not_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)


def all_notes(request):
    notes = Note.objects.select_related("owner")
    return render(request, "notes/all_notes.html", {"notes": notes})
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Kullanıcılar ve Hesaplar bölümündeki tüm dersler

Kendi başına pratik yap: Django playground