رابط عام
جزء من قسم المستخدمون والحسابات في رحلة Django على Coddy. الدرس 16 من 16.
تحتاج الملاحظة المشتركة إلى عنوان يمكن لأي شخص فتحه، سواء سجّل الدخول أم لا، ويعرض الملاحظة فقط. تحتوي صفحة المالك على «تعديل» و«حذف»؛ ويجب ألا تحتوي هذه الصفحة عليهما.
لقد استخدمت كل جزء بالفعل. يجب أن تحدد الصفحة ثلاثة أمور: من يمكنه فتحها، وأي ملاحظات يمكنها العثور عليها، والقالب الذي تستخدمه.
اختبرها بصفتك ثلاثة أشخاص: المالك، ومستخدمًا آخر، وزائرًا سجّل الخروج.
التحدي
متوسطاجعل للملاحظات المشتركة صفحة عامة.
- في
notes/urls.py، أضفshared/<int:pk>/باسمsharedلـshared_note. - في
notes/views.py، اكتبshared_noteمع@login_not_required. يعثر على الملاحظات المشتركة فقط؛ وأي ملاحظة أخرى تُرجع استجابة 404. - اعرض
notes/shared_note.html: العنوان والمتن والمالك، من دون روابط Edit أو Delete. - في
note_detail.html، ضمن القسم المشترك، اربطShare linkبـnotes:shared.
سجّل الخروج وافتح /shared/2/: ستظهر Pancakes، بينما يعطي /shared/1/ استجابة 404.
جرّب بنفسك
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