İ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.
Görev
OrtaYalnızca destek ekibinin erişebilmesi için /all/ adresini aç.
notes/views.pydosyasında, yalnızca notları görüntüleme için Django’nun yerleşik iznine sahip kullanıcılarınall_notessayfasını açmasına izin ver. Diğerleri giriş sayfası yerine 403 Yasak yanıtı almalı.base.htmldosyasında, İstatistikler bağlantısından sonra, yalnızca bu izne sahip kullanıcılara gösterilen ve/all/adresine giden birAll notesbağ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})
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