קישור ציבורי
חלק מהיחידה משתמשים וחשבונות במסלול ה-Django של Coddy. שיעור 16 מתוך 16.
הערה משותפת זקוקה לכתובת שכל אחד יכול לפתוח, בין שהוא מחובר ובין שלא, ושמציגה את ההערה ותו לא. בדף של הבעלים יש אפשרויות עריכה ומחיקה; בדף הזה הן לא אמורות להופיע.
כבר השתמשת בכל המרכיבים. שאל את השאלות שענית עליהן קודם: באתר פרטי, מי יכול לפתוח את הדף הזה? אילו הערות הוא יכול למצוא, ומה הוא מחזיר עבור האחרות? באיזו תבנית להשתמש, כדי שהדף לא יוכל לקשר לעריכה ולמחיקה? בטוח למסור קישור רק כשהשרת בודק אותו בכל בקשה.
בדוק אותו בתור שלושה אנשים: הבעלים, משתמש אחר ומבקר שהתנתק.
אתגר
בינוני- דף ציבורי בכתובת
/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})
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה משתמשים וחשבונות
תרגלו בעצמכם: Django אונליין