Формы в 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) Реализовать кнопку удалить для книжки

results matching ""

    No results matching ""