428
Глава 19 • Учетные записи пользователей
Рис. 19.1.
Страница для добавления новой темы
Добавление новых записей
Теперь, когда пользователь может добавлять новые темы, он также захочет добав-
лять новые записи. Мы снова определим URL, напишем новую функцию и шаблон
и создадим ссылку на страницу. Но сначала нужно добавить в
forms .py
еще один
класс.
Класс EntryForm
Мы должны создать форму, связанную с моделью
Entry
, но более специализиро-
ванную по сравнению с
TopicForm
:
forms.py
from django import forms
from .models import Topic, Entry
class TopicForm(forms.ModelForm):
...
class EntryForm(forms.ModelForm):
class Meta:
model = Entry
fields = ['text']
❶
labels = {'text': 'Entry:'}
❷
widgets = {'text': forms.Textarea(attrs={'cols': 80})}
Сначала в команду
import
к
Topic
добавляется
Entry
. Новый класс
EntryForm
на-
следует от
forms.ModelForm
и содержит вложенный класс
Meta
с указанием модели,
Редактирование данных
429
на которой он базируется, и поле, включаемое на форму. Полю
'text'
снова на-
значается пустая надпись
.
В точке
включается атрибут
widgets
.
Виджет
(widget) представляет собой эле-
мент формы HTML: однострочное или многострочное текстовое поле, раскрываю-
щийся список и т. д. Включая атрибут
widgets
, вы можете переопределить виджеты,
выбранные Django по умолчанию. Приказывая Django использовать элемент
forms.
Textarea
, мы настраиваем виджет ввода для поля
'text'
, чтобы ширина текстовой
области составляла 80 столбцов вместо значения по умолчанию 40. У пользователя
будет достаточно места для создания содержательных записей.
URL-адрес для new_entry
Необходимо включить аргумент
topic_id
в URL-адрес для создания новой записи,
потому что запись должна ассоциироваться с конкретной темой. Вот как выглядит
URL, который мы добавляем в
learning_logs/urls .py
:
urls.py
...
urlpatterns = [
...
# Страница для добавления новой записи
path('new_entry//', views.new_entry, name='new_entry'),
]
Эта схема URL соответствует любому URL-адресу в форме
http://localhost:8000/
new_entry/id/
, где
id
— число, равное идентификатору темы. Код
за-
хватывает числовое значение и сохраняет его в переменной
topic_id
. При запросе
URL-адреса, соответствующего этой схеме, Django передает запрос и идентифика-
тор темы функции представления
new_entry()
.
Функция представления new_entry()
Функция представления
new_entry
очень похожа на функцию добавления новой
темы. Включите следующий код в файл
views .py
:
views.py
from django.shortcuts import render, redirect
from .models import Topic
from .forms import TopicForm, EntryForm
...
def new_entry(request, topic_id):
"""Добавляет новую запись по конкретной теме."""
❶
topic = Topic.objects.get(id=topic_id)
430
Достарыңызбен бөлісу: |