Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

6.3 Создание представлений
2 из 2 шагов пройдено

Сделаем форму добавления новой книги, создадим файл books\forms.py со следующим содержимым:

from django.forms import ModelForm, CharField, TextInput
from .models import Book


class BookCreateForm(ModelForm):
    title = CharField(required=False, widget=TextInput(attrs={"class": "clrtxt", "placeholder": "Title"}))
    author = CharField(required=False, widget=TextInput(attrs={"class": "clrtxt", "placeholder": "Author"}))
    price = CharField(required=False, widget=TextInput(attrs={"class": "clrtxt", "placeholder": "Price"}))

    class Meta:
        model = Book
        fields = ['title', 'author', 'price']


Создадим файл шаблона формы templates\partial_create_book_form.html и добавим следующее содержимое:

<form>
    <div>
        <div>
            {{ form.title }}
        </div>

        <div>
            {{ form.author }}
        </div>

        <div>
            {{ form.price }}
        </div>

        <div>
            <!-- Кнопка "Add book" -->
            <button type="submit" class="disbtn"> Add book</button>
        </div>
    </div>
</form>


Подключим его в templates\base.html перед <table>:

                <!-- Форма для добавления новой книги -->
                {% include "partial_create_book_form.html" %}

                <!-- Таблица книг -->


Затем отредактируем функцию book_list() - добавим в неё форму.

После этого создадим новую функцию create_book(), которая будет сохранять книгу и в ответе будет возвращать строку таблицы только что добавленной книги.

Отредактируем файл books\views.py:

from django.http.response import HttpResponse
from django.shortcuts import render, get_object_or_404
from django.views.decorators.http import require_http_methods

from .models import Book
from .forms import BookCreateForm

@require_http_methods(['GET'])
def book_list(request):
    book_list = Book.objects.all()
    form = BookCreateForm(auto_id=False)
    return render(request, 'base.html', {'book_list': book_list, 'form': form})

@require_http_methods(['POST'])
def create_book(request):
    form = BookCreateForm(request.POST)
    if form.is_valid:
        book = form.save()
    return render(request, 'partial_book_detail.html', {'book': book})

 
Добавим маршрут для данной функции, отредактируем файл books\urls.py:

from django.urls import path
from .views import book_list, create_book

urlpatterns = [
    path("", book_list, name="book_list"),
    path("create_book/", create_book, name="create_book"),
]

Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Нет обсуждений. Начните первое.