Django 3: Форма добавления записей в БД

Панель навигации и создание ссылки

Добавим в панель навигации ссылку для добавления записей. В файле layout.html добавим элемент списка с кнопкой, стилизованной Bootstrap:

<li><button class="btn btn-primary">Добавить запись</button></li>

Ссылка будет /news/create. Используем шаблонизатор Jinja для её указания.

Создание URL и view-функции

Создадим обработчик URL в файле urls.py приложения news:

path('create/', views.create, name='create')

И функцию create в views.py:

def create(request):
    return render(request, 'news/create.html')

Эта функция возвращает шаблон create.html.

Создание HTML-шаблона и полей формы

Создадим файл create.html в templates/news/. Вставим базовый шаблон, изменим заголовок на «Форма добавления статьи» и добавим форму:

<form method="post">
  {% csrf_token %}
  <input type="text" class="form-control" placeholder="Название статьи">
  <input type="text" class="form-control" placeholder="Анонс статьи">
  <textarea class="form-control" placeholder="Текст статьи"></textarea>
  <input type="date" class="form-control">
  <input type="time" class="form-control">
  <button type="submit" class="btn btn-success">Добавить статью</button>
</form>

Стилизация формы

Добавим стили в news.css. При отсутствии стилей, очистите кэш браузера (правая кнопка мыши → Просмотреть код → зажать клавишу перезагрузки, навести на «Очистить кэш», отпустить клавишу).

Связывание формы с моделью и обработка данных

Создадим forms.py:

from .models import Articles
from django import forms

class ArticlesForm(forms.ModelForm):
    class Meta:
        model = Articles
        fields = ['title', 'anons', 'full_text', 'date']

Импортируем ArticlesForm в views.py:

from .forms import ArticlesForm

def create(request):
    error = ''
    if request.POST:
        form = ArticlesForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('home') # Или на страницу новостей
        else:
            error = 'Форма была заполнена неверно'
    context = {'form': ArticlesForm(), 'error': error}
    return render(request, 'news/create.html', context)

В create.html добавим вывод ошибки:

{% if error %}
  <p style="color: red;">{{ error }}</p>
{% endif %}

В шаблоне create.html выведем поля формы:

{{ form.title.as_widget(attrs={'class': 'form-control', 'placeholder': 'Название статьи'}) }}
{{ form.anons.as_widget(attrs={'class': 'form-control', 'placeholder': 'Анонс статьи'}) }}
{{ form.full_text.as_widget(attrs={'class': 'form-control', 'placeholder': 'Текст статьи'}) }}
{{ form.date.as_widget(attrs={'class': 'form-control', 'placeholder': 'Дата публикации'}) }}

Создана функциональная форма для добавления записей в базу данных, связанная с моделью и стилизованная Bootstrap. Обработка данных происходит на странице.

Что будем искать? Например,программа