رابط عام
جزء من قسم المستخدمون والحسابات في رحلة Django على Coddy. الدرس 16 من 16.
تحتاج الملاحظة المشتركة إلى عنوان يستطيع أي شخص فتحه، سواء سجّل الدخول أم لا، ويعرض الملاحظة ولا شيء غيرها. تحتوي صفحة المالك على زري Edit وDelete؛ ويجب ألا تحتوي هذه الصفحة عليهما.
لقد استخدمت كل قطعة بالفعل. اطرح الأسئلة التي أجبت عنها من قبل: في موقع خاص، من يمكنه فتح هذه الصفحة؟ ما الملاحظات التي يمكنه العثور عليها، وماذا تكون إجابته بخصوص الملاحظات الأخرى؟ أي قالب تستخدم، بحيث لا تستطيع الصفحة إنشاء رابط إلى Edit وDelete؟ لا يكون الرابط آمنًا للمشاركة إلا عندما يتحقق الخادم منه عند كل طلب.
اختبرها بصفتك ثلاثة أشخاص: المالك، ومستخدمًا آخر، وزائرًا سجّل الخروج.
التحدي
متوسط- صفحة عامة على المسار
/shared/<id>/، باسمshared، يمكن لأي شخص فتحها. تعرض عنوان الملاحظة المشتركة ونصها وعبارةShared byمع اسم المستخدم للمالك. - تُظهر الملاحظة الخاصة خطأ 404 هناك للجميع.
- لا توجد عليها روابط للتحرير أو الحذف.
- في صفحة الملاحظة المشتركة نفسها، يوجد رابط
Share linkإليها.
اضغط على Run، وسجّل الخروج، ثم افتح /shared/2/.
جرّب بنفسك
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})
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المستخدمون والحسابات
تدرّب بنفسك: Playground لـ Django