М97 Изучаем Python: программирование игр, визуализация данных, веб-приложения



Pdf көрінісі
бет329/334
Дата18.10.2023
өлшемі6,19 Mb.
#186390
1   ...   326   327   328   329   330   331   332   333   334
Байланысты:
Изучаем Python

views.py
...
@login_required
def edit_entry(request, entry_id):
"""Редактирует существующую запись."""
entry = Entry.objects.get(id=entry_id)
topic = entry.topic
if topic.owner != request.user:
raise Http404
if request.method != 'POST':
...
Программа читает запись и тему, связанную с этой записью. Затем мы проверяем, 
совпадает ли владелец темы с текущим пользователем; при несовпадении выдается 
исключение 
Http404
.
Связывание новых тем с текущим пользователем
В настоящее время страница добавления новых тем не совершенна, потому что 
она не связывает новые темы с конкретным пользователем. При попытке добавить 
новую тему выдается сообщение об ошибке 
IntegrityError
с уточнением 
NOT
NULL
constraint
failed:
learning_logs_topic.owner_id
. Django говорит, что при созда-
нии новой темы обязательно должно быть задано значение поля 
owner
.
Проблема легко решается, потому что мы можем получить доступ к информации 
текущего пользователя через объект 
request
. Добавьте следующий код, связыва-
ющий новую тему с текущим пользователем:
views.py
...
@login_required
def new_topic(request):
"""Определяет новую тему."""
if request.method != 'POST':
# Данные не отправлялись; создается пустая форма.
form = TopicForm()
else:


452
Глава 19 • Учетные записи пользователей
# Отправлены данные POST; обработать данные.
form = TopicForm(data=request.POST)
if form.is_valid():

new_topic = form.save(commit=False)

new_topic.owner = request.user

new_topic.save()
return redirect('learning_logs:topics')
# Вывести пустую или недействительную форму.
context = {'form': form}
return render(request, 'learning_logs/new_topic.html', context)
...
При первом вызове 
form.save()
передается аргумент 
commit=False
, потому что 
новая тема должна быть изменена перед сохранением в базе данных 

. Атрибуту 
owner
новой темы присваивается текущий пользователь 

. Наконец, мы вызываем 
save()
для только что определенного экземпляра темы 

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


Достарыңызбен бөлісу:
1   ...   326   327   328   329   330   331   332   333   334




©www.engime.org 2024
әкімшілігінің қараңыз

    Басты бет