Связывание новых тем с текущим пользователем

We use cookies. Read the Privacy and Cookie Policy

В настоящее время страница добавления новых тем несовершенна, потому что она не связывает новые темы с конкретным пользователем. При попытке добавить новую тему выдается сообщение об ошибке IntegrityError с уточнением learning_logs_topic.user_id may not be NULL. Django говорит, что при создании новой темы обязательно должно быть задано значение поля owner.

Проблема легко решается, потому что мы можем получить доступ к информации текущего пользователя через объект request. Добавьте следующий код, связывающий новую тему с текущим пользователем:

views.py

...

@login_required

def new_topic(request):

"""Определяет новую тему."""

if request.method != 'POST':

# Данные не отправлялись; создается пустая форма.

form = TopicForm()

else:

# Отправлены данные POST; обработать данные.

form = TopicForm(request.POST)

if form.is_valid():

(1) . . . . . .new_topic = form.save(commit=False)

(2) . . . . . .new_topic.owner = request.user

(3) . . . . . .new_topic.save()

return HttpResponseRedirect(reverse('learning_logs:topics'))

. . . . . .

context = {'form': form}

return render(request, 'learning_logs/new_topic.html', context)

...

При первом вызове form.save() передается аргумент commit=False, потому что новая тема должна быть изменена перед сохранением в базе данных (1) . Атрибуту owner новой темы присваивается текущий пользователь (2). Наконец, мы вызываем save() для только что определенного экземпляра темы (3). Теперь тема содержит все обязательные данные, и ее сохранение пройдет успешно.

Вы сможете добавить сколько угодно новых тем для любого количества разных пользователей. Каждому пользователю будут доступны только его собственные данные, какие бы операции он ни пытался выполнять: просмотр данных, ввод ­новых или изменение существующих данных.

Упражнения

19-3. Рефакторинг: в views.py есть два места, в которых программа проверяет, что пользователь, связанный с темой, является текущим пользователем. Поместите код этой проверки в функцию с именем check_topic_owner() и вызовите эту функцию при необходимости.

19-4. Защита new_entry: пользователь может попытаться добавить новую запись в журнал другого пользователя, вводя URL-адрес с идентификатором темы, принадлежащей другому пользователю. Чтобы предотвратить подобные атаки, перед сохранением новой записи проверьте, что текущий пользователь является владельцем темы, к которой относится запись.

19-5. Защищенный блог: в проекте Blog примите меры к тому, чтобы каждое сообщение в блоге было связано с конкретным пользователем. Убедитесь в том, что чтение всех сообщений доступно всем пользователям, но только зарегистрированные пользователи могут создавать новые и редактировать существующие сообщения. В представлении, в котором пользователи редактируют сообщения, перед обработкой формы убедитесь в том, что редактируемое сообщение принадлежит именно этому пользователю.