İ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 yanıtlayan 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 ayrıntılı bir kurala ihtiyaç duyar.
Her model için migrate dört izin oluşturur: ekleme, değiştirme, silme ve görüntüleme. Her biri, shop.change_product gibi uygulama etiketi ve bir kod adından oluşan bir adla adlandırılır. Bunları yönetici bölümünde kullanıcının sayfasından bir kullanıcıya veya gruba verirsiniz. Süper kullanıcı bunların tümüne sahiptir.
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 yönlendirilir. Bu ayarla birlikte 403 hatası 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
Orta- Yalnızca
notes.view_noteiznine sahip kullanıcılar/all/adresini açabilir. Diğerleri giriş sayfası yerine 403 Forbidden hatası alır. - Stats bağlantısından sonra, yalnızca bu izne sahip kullanıcılara gösterilen
All notesbağlantısı ekleyin.
Run'a basın ve /all/ adresini carol (bu izne sahip) ve bob (bu izne sahip değil) olarak açı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