Формы в Django (POST)
В этом уроке мы реализуем форму для добавления новой книжки уже на самой странице сайта.
Раньше мы добавляли книжки в интерфейсе администратора.
На прошлом уроке мы создали форму с нуля, теперь сделаем это через ModelForm
для сохранения содержимого формы в модель.
Шаг 1.Создаём форму для Book
В mainapp
создаём файл forms.py
и добавляем следующий код:
from django import forms
from .models import Book
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ('name', 'text',)
- Для начала мы импортировали формы Django (
from django import forms
) и нашу модельBook
(from .models import Book)
; BookForm
- имя для нашей формы, также мы говорим Django, что эта форма относится кModelForm;
class Meta
- здесь мы определяем, какая модель будет использоваться для создания формы (model = Book
);fields = ('name', 'text',)
- здесь мы указываем какие поля нашей модельки должны присутствовать в форме.
Шаг 2. Создаем представление (вьюшка)book_new
def book_new(request):
form = BookForm()
return render(request, 'book_add.html', {'form': form})
Здесь мы вызываемBookForm
и передаем её шаблону
Шаг 3. Создаем шаблон для отображения формы
В директории templates
создаем файл book_add.html
и добавляем следующий код:
{% extends 'base.html' %}
{% block content %}
<h1>New Book</h1>
<form method="POST" style="margin:20px;">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
{% endblock %}
С помощью {{ form_as.p }}
- мы отображаем нашу форму, которая должна быть обёрнута в HTML-теги <form method="POST"></form>;
as_p
- для того, чтобы каждый элемент формы был с новой строки;
{% csrf_token %}
- нужен для безопасности, так как мы отправляем данные методом POST;
<button type="submit">Save</button>
- кнопка для сохранения данных.
Шаг 4. Добавляем url для перехода на страницу с формой
url( r'^book/new/$', views.book_new, name='book_new'),
Для удобства мы можем добавить кнопку в base.html
для перехода на нашу страницу с формой , так она будет видна везде:
<header>
<ul>
<li><a href="{% url 'book_new' %}" class="icon style2 fa-plus"></a></li>
...
...
</ul>
</header>
{% url 'book_new' %}
- здесь мы указываем название вьюшки
В итоге получаем кнопочку с плюсом:
Запускаем проект и переходим по ссылке:
Если заполнить поля и попробовать сохранить, ничего не произойдет, наши записи не добавлены.
Нам нужно дописать нашу вьюшку для сохранения данных.
Шаг 5. Сохраняем данные из формы
mainapp/views.py
def book_new(request):
if request.method == "POST":
form = BookForm(request.POST)
if form.is_valid():
book = form.save()
book.pub_date = timezone.now()
book.save()
return redirect('book_detail', pk=book.pk)
else:
form = BookForm()
return render(request, 'book_add.html', {'form': form})
В представлении нам нужно обработать две разные ситуации.
1) когда мы только зашли на страницу и хотим получить пустую форму.
2) когда мы возвращаемся к представлению со всей информацией, которую мы ввели в форму.
Таким образом, нам потребуется ввести условие (для этого мы будем использовать условный оператор if else
form = BookForm(request.POST)
- если метод - POST, тогда мы хотим построитьBookForm
с данными из формы;
form.is_valid()
- здесь мы проверяем корректна ли форма, все ли поля заполнены;
и сохраняем содержимое формы.
После добавления новой книжки нам нужно отобразить её в другом шаблоне, поэтому делаем переадресацию:
return redirect('book_detail', pk=book.pk)
'book_detail'
- название вьюшки, которой у нас пока что нет.pk=book.pk
- "pk" - это сокращенно primary key, он уникальным образом определяет каждую книжку в базе данных. Для получения первичного ключа мы написали book.pk
Давайте добавим book_detail
в наши views:
def book_detail(request, pk):
book = get_object_or_404(Book, pk=pk)
return render(request, 'book_detail.html', {'book': book})
Здесь мы просто вызываем объект Book
и отображаем ее в шаблоне.
Создаем шаблон для страницы книжки:
book_detail.html
{% extends 'base.html' %}
{% load staticfiles %}
{% block content %}
<div>
<a href="images/ht.jpg">
<img src="{% static "images/ht.jpg" %}" alt="" />
</a>
<h1><a href="{% url 'book_detail' pk=book.pk %}">{{ book.name }}</a></h1>
<h1 style="border:1px solid white;">{{ book.text }}</h1>
</div>
{% endblock %}
Нам осталось добавить url для нашей новой вьюшки:
urls.py
url(r'^book/(?P<pk>\d+)/$', views.book_detail, name='book_detail'),
На этом всё! После заполнения формы мы сохраняем данные и перенаправляемся на страницу только что, созданной книжки.
Задание:
1) Залить в гит обновленную версию проекта.
2) Реализовать кнопку удалить для книжки