ملاحظاتي فقط
جزء من قسم المستخدمون والحسابات في رحلة Django على Coddy. الدرس 9 من 16.
لكل ملاحظة مالك، لكن القائمة ما زالت تعرض Note.objects.all(): تقرأ ada يوميات bob. ينبغي أن تعرض القائمة ملاحظات الشخص الذي يطلبها فقط.
تُجري التصفية باستخدام كائن على ForeignKey، وليس باستخدام اسم. يعرض موقع مكتبة كتب مؤلف واحد:
author = Author.objects.get(name="Ursula K. Le Guin")
books = Book.objects.filter(author=author)يقارن Django معرّف المؤلف. تمرير الاسم، filter(author="Ursula K. Le Guin")، يؤدي إلى ValueError.
عندما يكون الصف الذي تريد المقارنة به هو الزائر، فلا حاجة إلى البحث عن أحد: فقد أضاف Django المستخدم المسجّل دخوله إلى كل طلب بالفعل، بوصفه كائنًا مأخوذًا من الجلسة. لا تأخذ المستخدم من عنوان URL أو من حقل في نموذج، إذ يمكن لأي شخص تغييره.
التحدي
سهلفي note_list، اعرض ملاحظات المستخدم الذي سجّل دخوله فقط.
اضغط على تشغيل وسجّل الدخول باسم ada، ثم سجّل الخروج وسجّل الدخول باسم bob (يستخدم كلاهما coddy-pass-123). سيظهر لكلٍّ منهما ملاحظاته الخاصة فقط.
جرّب بنفسك
from django.contrib.auth import login
from django.contrib.auth.decorators import login_not_required
from django.contrib.auth.forms import UserCreationForm
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.all()
return render(request, "notes/note_list.html", {"notes": notes})
def note_detail(request, pk):
note = get_object_or_404(Note, pk=pk)
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)
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)
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})
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المستخدمون والحسابات
تدرّب بنفسك: Playground لـ Django