Обработка форм в Django

Обработка форм
Объект Request

request.path Полный путь, не включая домен, но включая ведущий символ слеша (“/hello/”)
request.get_host() Доменное имя (“127.0.0.1:8000” или “www.example.com”)
request.get_full_path() Путь path вместе со строкой запроса (если присутствует) (“/hello/?print=true”)
request.is_secure() True, если запрос отправлен по протоколу HTTPS, иначе False (True или False)
request.META - мета заголовки, IP, USER-AGENT и тд.
request.GET - данные переданные в GET запросе
request.POST - данные перданные в POST запросе

Пример обработки формы

def search(request):
	if ‘q’ in request.GET and request.GET[‘q’]:
		q = request.GET[‘q’]
		books = Book.objects.filter(title__icontains=q)
		return render_to_response(‘search_results.html’, {‘books’: books, ‘query’: q})
	else:
		return HttpResponse(‘Введите поисковый запрос.’)

# Проверка что q сущенствует в GET, 
# Проверка что GET['q'] не пуст
#__icontains = поиск без учета регистра

Шаблон:

{% if books %}

Найдено {{ books|length }} книг{{ books|pluralize }}.

 

    • {% for book in books %}

    • {{ book.title }}

{% endfor %}

# Query_Set | length — отображает количество объектов Query_Set переданной модели query_set # Query_Set | pluralize — добавляет окончение ‘S’ если кол-ва объектов Query_Set больше одного\

Форма отправки отчетов

from django.core.mail import send_mail
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response

def contact(request):
	errors = []
	if request.method == ‘POST’:
		if not request.POST.get(‘subject’, ‘’):
		errors.append(Введите тему.’)
	if not request.POST.get(‘message’, ‘’):
		errors.append(‘Введите сообщение.’)
	if request.POST.get(‘e-mail’) and ‘@’ not in request.POST[‘e-mail’]:
		errors.append(‘Введите правильный адрес e-mail.’)
	if not errors:
		send_mail(
			request.POST[‘subject’],
			request.POST[‘message’],
			request.POST.get(‘e-mail’, ‘noreply@example.com’),
			[‘siteowner@example.com’],
			)
			return HttpResponseRedirect(‘/contact/thanks/’)
		return render_to_response(‘contact_form.html’, ‘errors’: errors})

# return HttpResponseRedirect(‘/contact/thanks/’) - Перенаправление на новый адрес

Библиотека Django.forms
В сообществе принято соглашение помещать все классы Form в отдельный файл forms.py.

from django import forms
class ContactForm(forms.Form):
	subject = forms.CharField(max_length = 100, label = 'Тема', widget=forms.TextInput(attrs={'placeholder': 'Search', 'class':'cust_class',}))
	e-mail = forms.EmailField(required=False) # required=False - необязательное поля
	message = forms.CharField(widget = forms.Textarea)

Список всех доступных полей(https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/#modelform)
Примеры:

>>> print f[‘subject’]
	
>>> print f[‘message’]
	
>>> print f.as_ul()

 


  • # Вставка форм в html
    {{ form.as_table}} # Оббертывает форму в теги table
    {{form.as_ul}}, {{form.as_p}} # Оббертывает форму в теги ul, p
    ……….

Обработка форм в views.py

from django.shortcuts import render_to_response
from mysite.contact.forms import ContactForm

def contact(request):
if request.method == ‘POST’:
form = ContactForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
send_mail(
cd[‘subject’],
cd[‘message’],
cd.get(‘e-mail’, ‘noreply@example.com’),
[‘siteowner@example.com’],
)
return HttpResponseRedirect(‘/contact/thanks/’)
else:
form = ContactForm(
initial = {‘subject’: ‘Начальное значение поля Subject’, }
)
return render_to_response(‘contact_form.html’, {‘form’: form})

# contact_form.html

 

Свяжитесь с нами

{% if form.errors %}

Исправьте следующие ошибки{{ form.errors|pluralize }}

{% endif %}

{% csrf_tooken %}

{{ form.as_table }}

 

Приложение

Model field 	Form field
AutoField 	Not represented in the form
BigAutoField 	Not represented in the form
BigIntegerField 	IntegerField with min_value set to -9223372036854775808 and max_value set to 9223372036854775807.
BinaryField 	CharField, if editable is set to True on the model field, otherwise not represented in the form.
BooleanField 	BooleanField, or NullBooleanField if null=True.
CharField 	CharField with max_length set to the model field’s max_length and empty_value set to None if null=True.
DateField 	DateField
DateTimeField 	DateTimeField
DecimalField 	DecimalField
EmailField 	EmailField
FileField 	FileField
FilePathField 	FilePathField
FloatField 	FloatField
ForeignKey 	ModelChoiceField (see below)
ImageField 	ImageField
IntegerField 	IntegerField
IPAddressField 	IPAddressField
GenericIPAddressField 	GenericIPAddressField
ManyToManyField 	ModelMultipleChoiceField (see below)
NullBooleanField 	NullBooleanField
PositiveIntegerField 	IntegerField
PositiveSmallIntegerField 	IntegerField
SlugField 	SlugField
SmallIntegerField 	IntegerField
TextField 	CharField with widget=forms.Textarea
TimeField 	TimeField
URLField 	URLField