В Django создать форму программно довольно просто. Это упрощается за счет использования класса ModelForm. Это позволяет Django помочь нам в создании наших форм, используя наши модели с соответствующей проверкой.
Мы экономим время и усилия, поскольку нам не нужно создавать форму с нуля и разрабатывать нашу фундаментальную проверку. Это класс, с которым мы будем работать для нашего приложения электронной библиотеки.
Вот цели этого урока:
- Создайте новый файл с именем
forms.pyв папке приложения электронной библиотеки. Здесь мы пишем форму в Django.
- Используйте
ModelFormкласс для создания формы из нашейCatalogмодели.
- Используйте
BootStrapбиблиотеку CSS, чтобы добавить стиль к форме.
Создание формы
Создаем новый файл с именем forms.py в папке elibrary_app и добавляем следующий код:
from django import forms
from .models import Catalog
class AddBookForm(forms.ModelForm):
class Meta:
model = Catalog
fields = "__all__"
widgets = {
'title': forms.fields.TextInput(attrs={
'class': 'form-control'
}),
'ISBN': forms.fields.TextInput(attrs={
'class': 'form-control'
}),
'author': forms.fields.TextInput(attrs={
'class': 'form-control'
}),
'price': forms.fields.NumberInput(attrs={
'class': 'form-control'
}),
'availability': forms.fields.Select(attrs={
'class': 'form-control'
})
}
Этот файл имеет решающее значение, поскольку он содержит информацию о нашей форме и о том, как она будет отображаться в шаблоне.
- Строка 5: Мы добавляем новый класс, вызываемый
AddBookFormпослеforms.pyсоздания файла. Это потомок классаModelForm. У нас также есть возможность использовать классFormдля созданияformс нуля.
- Строка 6: В этом классе существует мета класс . Здесь мы укажем модель, которую хотим использовать, а также поле, которое хотим преобразовать в поле ввода HTML.
- Строка 8: Мы говорим
Catalogмодели использовать все поля. Однако мы предлагаем некоторые варианты настройки. Атрибут классаform-controlдобавляется в HTML-форму. Это поможет нам настроить форму позже, чтобы она выглядела презентабельно.
Далее мы внесем некоторые изменения в файл views.py:
from django.shortcuts import render
from .forms import AddBookForm
def home(request):
add_book_form = AddBookForm()
return render(request, 'index.html', {
"add_book_form": add_book_form,
})
- Строки 6 и 9: мы отображаем форму, которую создали ранее, в шаблоне с именем
index.html.
Чтобы добавить этот шаблон, мы в папку templates создадим новый файл с именем index.html.
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<title>Hello World</title>
</head>
<body>
<div class="container">
<h1>Hello World</h1>
<form method="post">
{% csrf_token %}
{{ add_book_form.as_p }}
<br>
<div class="text-center">
<input type="submit" class="btn btn-warning" style="width: 100%" value="Add Book">
</div>
</form>
</div>
</body>
</html>
Внутри /templates/index.html файла мы создаем форму с методом POST.
Различные поля ввода включаются с помощью {{ add_book_form.as_p }} переменной шаблона.
Скрытое поле CSRF также включается с помощью {% csrf_token %} тега шаблона.
Некоторые из стилей по умолчанию выполняются с помощью Bootstrap 5 CSS. Вот почему наша форма имеет класс form-control.
Запускаем тесты
Код формы успешно написан. Мы можем повторно запустить тесты, чтобы убедиться, что они успешно пройдены, используя следующие инструкции:
-
python manage.py test elibrary_app.tests.CatalogFormTests.test_book_form
-
python manage.py test elibrary_app.tests.CatalogFormTests.test_bootstrap_class_used_for_default_styling
-
python manage.py test elibrary_app.tests.CatalogFormTests.test_book_form_validation_for_blank_items
Запустите глобальный тест, чтобы убедиться, что все тесты проходят с помощью этой команды:
-
python manage.py test