Редактирование данных
433
def topics(request):
"""Выводит список тем."""
topics = Topic.objects.filter(owner=request.user).order_by('date_added')
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
...
Если пользователь выполнил вход, в объекте запроса устанавливается атрибут
request.user
с информацией о пользователе. Фрагмент кода
Topic.objects.
filter(owner=request.user)
приказывает Django извлечь из базы данных только
те объекты
Topic
, у которых атрибут
owner
соответствует текущему пользователю.
Так как способ отображения не изменяется, изменять шаблон для страницы тем
вообще не нужно.
Чтобы увидеть, как работает этот способ, выполните вход в качестве пользователя,
с которым связаны все существующие темы, и перейдите к странице со списком
тем. На ней должны отображаться все темы. Теперь завершите сеанс и войдите
снова с другой учетной записью. На этот раз страница должна быть пустой.
Защита
тем пользователя
Никаких реальных ограничений на доступ к страницам еще не существует, по-
этому любой зарегистрированный пользователь может опробовать разные URL
(например,
http://localhost:8000/topics/1/
) и просмотреть страницы тем, которые
ему удастся подобрать.
Попробуйте сделать это. После входа с учетной записью суперпользователя ско-
пируйте URL или запишите идентификатор в URL темы, после чего завершите
сеанс и войдите снова от имени другого пользователя. Введите URL этой темы.
Вам удастся прочитать все записи, хотя сейчас вы вошли под именем другого
пользователя.
Чтобы решить эту проблему, мы будем выполнять проверку перед получением
запрошенных данных в функции представления
topic()
:
views.py
from django.shortcuts
import render
from django.http import HttpResponseRedirect, Http404
from django.core.urlresolvers
import reverse
...
@login_required
def topic(request, topic_id):
"""Выводит одну тему и все ее записи."""
topic = Topic.objects.get(id=topic_id)
# Проверка того, что тема принадлежит текущему пользователю.
if topic.owner != request.user:
raise Http404
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)
...