При создании класса Form наиболее важной деталью является определение полей формы. Каждое поле обладает собственной логикой проверки вводимых данных наряду с дополнительными возможностями.
Несмотря на то, что обычно классы Field используются внутри классов Form, вы можете создавать их объекты самостоятельно, чтобы понять как они работают. Каждый экземпляр класса Field имеет метод clean(), который принимает единственный аргумент и который вызывает исключение django.forms.ValidationError в случае ошибки или возвращает чистое значение:
>>> from django import forms
>>> f = forms.EmailField()
>>> f.clean('foo@example.com')
'foo@example.com'
>>> f.clean('invalid email address')
Traceback (most recent call last):
...
ValidationError: ['Enter a valid email address.']
Каждый конструктор класса Field принимает эти аргументы. Некоторые классы Field принимают дополнительные аргументы. Перечисленные ниже аргументы принимаются всеми полями:
По умолчанию каждый класс Field предполагает значение обязательным. Таким образом, если вы передадите ему пустое значение, т.е. None или пустую строку (""), то метод clean() вызовет исключение ValidationError:
>>> from django import forms
>>> f = forms.CharField()
>>> f.clean('foo')
'foo'
>>> f.clean('')
Traceback (most recent call last):
...
ValidationError: ['This field is required.']
>>> f.clean(None)
Traceback (most recent call last):
...
ValidationError: ['This field is required.']
>>> f.clean(' ')
' '
>>> f.clean(0)
'0'
>>> f.clean(True)
'True'
>>> f.clean(False)
'False'
Для того, чтобы сделать поле “необязательным” передайте required=False в конструктор Field:
>>> f = forms.CharField(required=False)
>>> f.clean('foo')
'foo'
>>> f.clean('')
''
>>> f.clean(None)
''
>>> f.clean(0)
'0'
>>> f.clean(True)
'True'
>>> f.clean(False)
'False'
Если Field получило required=False и вы передали в метод clean() пустое значение, то метод вернёт нормализованное пустое значение, а не вызовет исключение ValidationError. Для CharField таким значением будет юникодная пустая строка. Для других классов Field этим значением может быть None. (Это поведение меняется от поля к полю.)
Аргумент label позволяет вам определить “видимую людьми” метку для этого поля. Оно используется когда Field отображается на форме.
Как показано ранее в Выдаче формы в виде HTML, стандартная метка для Field создаётся из имени поля, с преобразованием всех символов подчёркивания в пробелы и переводом первой буквы в верхний регистр. Укажите label, если это стандартная метка не подходит для вашей задачи.
Ниже приведён пример формы, которая определяет метки для двух своих полей. Мы используем auto_id=False для упрощения вывода:
>>> from django import forms
>>> class CommentForm(forms.Form):
... name = forms.CharField(label='Your name')
... url = forms.URLField(label='Your Web site', required=False)
... comment = forms.CharField()
>>> f = CommentForm(auto_id=False)
>>> print(f)
<tr><th>Your name:</th><td><input type="text" name="name" /></td></tr>
<tr><th>Your Web site:</th><td><input type="url" name="url" /></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
Аргумент label_suffix позволяет вам переопределить атрибут формы label_suffix для каждого поля:
>>> class ContactForm(forms.Form):
... age = forms.IntegerField()
... nationality = forms.CharField()
... captcha_answer = forms.IntegerField(label='2 + 2', label_suffix=' =')
>>> f = ContactForm(label_suffix='?')
>>> print(f.as_p())
<p><label for="id_age">Age?</label> <input id="id_age" name="age" type="number" /></p>
<p><label for="id_nationality">Nationality?</label> <input id="id_nationality" name="nationality" type="text" /></p>
<p><label for="id_captcha_answer">2 + 2 =</label> <input id="id_captcha_answer" name="captcha_answer" type="number" /></p>
Аргумент initial позволяет определять начальное значение для поля, при его отображении на незаполненной форме.
Для определения динамических начальных данных, используйте параметр Form.initial.
Использование этого аргумента подходит для отображения пустой формы, в которой поля будут иметь указанные значения. Например:
>>> from django import forms
>>> class CommentForm(forms.Form):
... name = forms.CharField(initial='Your name')
... url = forms.URLField(initial='http://')
... comment = forms.CharField()
>>> f = CommentForm(auto_id=False)
>>> print(f)
<tr><th>Name:</th><td><input type="text" name="name" value="Your name" /></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" value="http://" /></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
Вам могло прийти в голову просто передать словарь с начальными значениями при отображении формы. Но если так сделать, то вы запустите механизм проверки данных и HTML код формы будет содержать в себе результаты этой проверки:
>>> class CommentForm(forms.Form):
... name = forms.CharField()
... url = forms.URLField()
... comment = forms.CharField()
>>> default_data = {'name': 'Your name', 'url': 'http://'}
>>> f = CommentForm(default_data, auto_id=False)
>>> print(f)
<tr><th>Name:</th><td><input type="text" name="name" value="Your name" /></td></tr>
<tr><th>Url:</th><td><ul class="errorlist"><li>Enter a valid URL.</li></ul><input type="url" name="url" value="http://" /></td></tr>
<tr><th>Comment:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="comment" /></td></tr>
Это главная причина, по которой начальные значения отображаются только на незаполненных формах. Для заполненных форм, HTML код всегда будет содержать введённые в форму данные.
Также следует отметить, что начальные значения не используются в качестве значений по умолчанию во время проведения проверки данных в полях формы. Начальные значения, определённые в initial предназначены лишь для первого отображения формы:
>>> class CommentForm(forms.Form):
... name = forms.CharField(initial='Your name')
... url = forms.URLField(initial='http://')
... comment = forms.CharField()
>>> data = {'name': '', 'url': '', 'comment': 'Foo'}
>>> f = CommentForm(data)
>>> f.is_valid()
False
# The form does *not* fall back to using the initial values.
>>> f.errors
{'url': ['This field is required.'], 'name': ['This field is required.']}
Вместо констант вы также можете передавать любой исполняемый объект (callable):
>>> import datetime
>>> class DateForm(forms.Form):
... day = forms.DateField(initial=datetime.date.today)
>>> print(DateForm())
<tr><th>Day:</th><td><input type="text" name="day" value="12/23/2008" /><td></tr>
Исполняемый объект будет вычислен только в момент отображения незаполненной формы.
Аргумент widget позволяет указать класс Widget, который следует использовать при отображении поля. Обратитесь к Виджеты для более подробной информации.
Аргумент help_text позволяет указать описание для поля. Если вы укажете help_text, он будет показан около поля при отображении формы с помощью вспомогательных методов Form (например, через as_ul()).
Ниже представлен пример формы, в которой help_text определён у двух полей. Мы используем auto_id=False для упрощения вывода:
>>> from django import forms
>>> class HelpTextContactForm(forms.Form):
... subject = forms.CharField(max_length=100, help_text='100 characters max.')
... message = forms.CharField()
... sender = forms.EmailField(help_text='A valid email address, please.')
... cc_myself = forms.BooleanField(required=False)
>>> f = HelpTextContactForm(auto_id=False)
>>> print(f.as_table())
<tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" /><br /><span class="helptext">100 characters max.</span></td></tr>
<tr><th>Message:</th><td><input type="text" name="message" /></td></tr>
<tr><th>Sender:</th><td><input type="email" name="sender" /><br />A valid email address, please.</td></tr>
<tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr>
>>> print(f.as_ul()))
<li>Subject: <input type="text" name="subject" maxlength="100" /> <span class="helptext">100 characters max.</span></li>
<li>Message: <input type="text" name="message" /></li>
<li>Sender: <input type="email" name="sender" /> A valid email address, please.</li>
<li>Cc myself: <input type="checkbox" name="cc_myself" /></li>
>>> print(f.as_p())
<p>Subject: <input type="text" name="subject" maxlength="100" /> <span class="helptext">100 characters max.</span></p>
<p>Message: <input type="text" name="message" /></p>
<p>Sender: <input type="email" name="sender" /> A valid email address, please.</p>
<p>Cc myself: <input type="checkbox" name="cc_myself" /></p>
Аргумент error_messages позволяет изменить стандартные сообщения об ошибках, которые выдаёт поле. Создайте словарь с ключами тех сообщений, которые вы желаете изменить. Например, стандартное сообщение об ошибке:
>>> from django import forms
>>> generic = forms.CharField()
>>> generic.clean('')
Traceback (most recent call last):
...
ValidationError: ['This field is required.']
А вот собственное сообщение об ошибке:
>>> name = forms.CharField(error_messages={'required': 'Please enter your name'})
>>> name.clean('')
Traceback (most recent call last):
...
ValidationError: ['Please enter your name']
В разделе классы встроенных полей показано, что каждое поле определяет ключи сообщений об ошибках, которые оно использует.
Аргумент validators позволяет указать список функций, осуществляющих проверку поля.
Обратитесь к документации на валидаторы для подробной информации.
Аргумент localize включает локализацию для данных формы, как на входе, так и на выходе.
Обратитесь к документации на формат локализации для подробной информации.
Этот метод был переименован из _has_changed().
Метод has_changed() используется для определения наличия изменений значения поля по сравнению с начальным состоянием. Возвращает True или False.
Смотрите документацию на Form.has_changed() для подробностей.
Библиотека форм поставляется с набором классов Field, которые предоставляют решение общих задач проверки данных. Этот раздел описывает каждое встроенное поле.
Для каждого поля мы указываем виджет, который используется в случае, если вы явно не определили нужный вам виджет. Мы также указываем значение, которое будет возвращено, если вы предоставили пустое значение (см. required).
Стандартный виджет: CheckboxInput
Пустое значение: False.
Возвращает: True или False языка Python.
Гарантирует, что значение равно True (т.е. чекбокс отмечен), если поле имеет атрибут required=True.
Ключи сообщений об ошибках: required.
Примечание
Так как все потомки Field по умолчанию имеют required=True, это условие проверки имеет большое значение. Если вам требуется включить в свою форму булево значение, которое может принимать значения True или False (т.е. отмеченный или неотмеченный чекбокс), то вы должны передать required=False в создаваемое поле BooleanField.
Стандартный виджет: TextInput
Пустое значение: '' (пустая строка).
Возвращает: Объект Unicode.
Проверяет max_length или min_length, если они указаны. В противном случае, любые значения будут правильными.
Ключи сообщений об ошибках: required, max_length, min_length.
Имеет два необязательных аргумента для проверки:
Если они указаны, то производится соответствующая проверка длины полученной строки.
Стандартный виджет: Select
Пустое значение: '' (пустая строка).
Возвращает: Объект Unicode.
Проверяет, что введённое значение присутствует в списке вариантов.
Ключи сообщений об ошибках: required, invalid_choice.
Сообщение об ошибке invalid_choice может содержать %(value)s, которое будет замещено выбранным вариантом.
Принимает один дополнительный обязательный аргумент:
Итерируемый объект (т.е. список или кортеж), содержащий ряд двухэлементных кортежей, для использования в качестве вариантов для данного поля, или вызываемый объект, который возвращает такой итерируемый объект. Этот аргумент принимает те же форматы, что и аргумент choices поля модели. Обратитесь к справочнику по полям модели для подробной информации. Если в качестве аргумента используется вызываемый объект, он вычисляется при каждой инициализации поля формы.
Была добавлена возможность передавать вызываемый объект в choices.
Аналогично ChoiceField, но TypedChoiceField принимает два дополнительных аргумента, coerce и empty_value.
Стандартный виджет: Select
Пустое значение: Всё, что вы назовёте empty_value.
Возвращает: Значение типа, указанного аргументом coerce.
Проверяет, что полученное значение присутствует в списке вариантов и может быть преобразовано в нужный тип.
Ключи сообщений об ошибках: required, invalid_choice.
Принимает дополнительные аргументы:
Функция, которая принимает один аргумент и возвращает преобразованное значение. Например, можно использовать стандартные int, float, bool и другие типы. Функция по умолчанию не выполняет преобразования. Преобразование значения происходит после валидации, поэтому можно вернуть значение, которое отсутствует в choices.
Значение, используемое для представления “пустоты”. Обычно это пустая строка. None является ещё одним вариантом. Следует отметить, что это значение не будет преобразовываться функцией, определённой аргументом coerce, так что выбирайте значение соответственно.
Стандартный виджет: DateInput
Пустое значение: None.
Возвращает: Объект datetime.date языка Python.
Проверяет, что полученное значение является объектом datetime.date, datetime.datetime или строкой, отформатированной в нужном виде.
Ключи сообщений об ошибках: required, invalid.
Принимает один необязательный аргумент:
Список форматов, используемых при попытках сконвертировать строку в объект datetime.date.
Если аргумент input_formats не предоставлен, то используются следующие форматы:
['%Y-%m-%d', # '2006-10-25'
'%m/%d/%Y', # '10/25/2006'
'%m/%d/%y'] # '10/25/06'
Дополнительно, если вы указали USE_L10N=False в конфигурации проекта, следующее будет включено в список форматов по умолчанию:
['%b %d %Y', # 'Oct 25 2006'
'%b %d, %Y', # 'Oct 25, 2006'
'%d %b %Y', # '25 Oct 2006'
'%d %b, %Y', # '25 Oct, 2006'
'%B %d %Y', # 'October 25 2006'
'%B %d, %Y', # 'October 25, 2006'
'%d %B %Y', # '25 October 2006'
'%d %B, %Y'] # '25 October, 2006'
Обратитесь к документации на формат локализации для подробной информации.
Стандартный виджет: DateTimeInput
Пустое значение: None.
Возвращает: Объект datetime.datetime языка Python.
Проверяет, что полученное значение является объектом datetime.datetime, datetime.date или строкой, отформатированной в нужном виде.
Ключи сообщений об ошибках: required, invalid.
Принимает один необязательный аргумент:
Список форматов, используемых при попытках сконвертировать строку в объект datetime.datetime.
Если аргумент input_formats не предоставлен, то используются следующие форматы:
['%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25'
'%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
'%m/%d/%Y %H:%M', # '10/25/2006 14:30'
'%m/%d/%Y', # '10/25/2006'
'%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
'%m/%d/%y %H:%M', # '10/25/06 14:30'
'%m/%d/%y'] # '10/25/06'
Обратитесь к документации на формат локализации для подробной информации.
Не рекомендуется, начиная с версии 1.7: Возможность использоть SplitDateTimeWidget с DateTimeField устарела и будет убрана в Django 1.9. Вместо этого используйте SplitDateTimeField.
По умолчанию используется виджет NumberInput при Field.localize равном False, иначе TextInput.
Пустое значение: None.
Возвращает: Тип decimal языка Python.
Проверяет, что полученное значение является десятичным. Пробелы до и после значения игнорируются.
Ключи сообщений об ошибках: required, invalid, max_value, min_value, max_digits, max_decimal_places, max_whole_digits.
Сообщения об ошибках max_value и min_value могут содержать шаблон %(limit_value)s, который будет заполнен соответствующим значением. Аналогично, сообщения об ошибках max_digits, max_decimal_places и max_whole_digits могут содержать %(max)s.
Принимает четыре необязательных аргумента:
Эти аргументы управляют диапазоном значений, разрешённых для ввода в поле, и должны быть заполнены значениями decimal.Decimal.
Максимальное число разрядов (до и после десятичной точки, впередистоящие нули обрезаются) разрешённых в значении.
Максимальное число разрешённых десятичных разрядов.
Стандартный виджет: TextInput
Пустое значение: None.
Нормализует к timedelta.
Проверяет, что полученное значение является строкой, которая может быть преобразована в timedelta.
Ключи сообщений об ошибках: required, invalid.
Принимает любой формат, который понимает parse_duration().
Стандартный виджет: EmailInput
Пустое значение: '' (пустая строка).
Возвращает: Объект Unicode.
Проверяет, что полученное значение является правильным адресом электронной почты, используя достаточно сложное регулярное выражение.
Ключи сообщений об ошибках: required, invalid.
Имеет два необязательных аргумента: max_length и min_length. Если аргументы указаны, то они контролируют диапазон принимаемого значения.
Стандартный виджет: ClearableFileInput
Пустое значение: None.
Возвращает: Объект UploadedFile, который оборачивает содержимое файла и его имя в единый объект.
Может проверять, что данные непустого файла были связаны с формой.
Ключи сообщений об ошибках: required, invalid, missing, empty, max_length.
Имеет два необязательных аргумента: max_length и allow_empty_file. Если аргументы указаны, то первый ограничивает длину имени файла, а второй позволяет загружать даже пустые файлы.
Для получения подробностей об объекте ``UploadedFile`, см. документацию по загрузке файлов.
При использовании FileField на форме, вы должны не забыть связать данные файла с формой.
Ошибка max_length относится к длине имени файла. В сообщении об ошибке шаблон %(max)d будет заменён максимальной длиной имени файла, а %(length)d – длиной имени текущего файла.
Стандартный виджет: Select
Пустое значение: None.
Возвращает: Объект Unicode.
Проверяет, что выбранное значение присутствует в списке вариантов.
Ключи сообщений об ошибках: required, invalid_choice.
Поле позволяет выбирать файл из определённого каталога. Оно принимает три дополнительных аргумента, требуя обязательного наличия аргумента path:
Абсолютный путь до каталога, содержимое которого вы желаете отобразить. Этот каталог должен существовать.
Если False (по умолчанию), то будет показано только содержимое каталога, указанного в path. Если True, то будет показано также и содержимое всех вложенных каталогов.
Шаблон регулярного выражения. Отображаться будут только те файлы, которые подходят под указанное регулярное выражение.
Необязательно. Возможные значения: True или False. По умолчанию: True. Определяет, следует ли подключать файлы из указанного места или нет. Этот атрибут или allow_folders должен быть установлен в True.
Необязательно. Возможные значения: True или False. По умолчанию: False. Определяет, следует ли подключать каталоги из указанного места или нет. Этот атрибут или allow_files должен быть установлен в True.
По умолчанию используется виджет NumberInput при Field.localize равном False, иначе TextInput.
Пустое значение: None.
Возвращает: Тип float языка Python.
Проверяет, что полученное значение является числом с плавающей точкой. Пробелы до и после значения не влияют на преобразование значения, так как эта ситуация обрабатывается функцией float() языка Python.
Ключи сообщений об ошибках: required, invalid, max_value, min_value.
Принимает два необязательных аргумента для проверки: max_value и min_value. Они определяют диапазон значений, разрешённый для поля.
Стандартный виджет: ClearableFileInput
Пустое значение: None.
Возвращает: Объект UploadedFile, который оборачивает содержимое файла и его имя в единый объект.
Проверяет, что данные файла были связаны с формой, а затем, что файл является изображением, формат которого поддерживается библиотекой Pillow.
Ключи сообщений об ошибках: required, invalid, missing, empty, invalid_image.
Использование ImageField требует наличия Pillow (рекомендуется) с поддержкой используемых вами форматов изображений. Если вы сталкиваетесь с ошибкой corrupt image при загрузке изображения, обычно это означает, что Pillow не поддерживает такой формат изображения. Для решения этой проблемы, установите соответствующую библиотеку и переустановите Pillow.
При использовании ImageField на форме, вы должны не забыть связать данные файла с формой.
После очистки и проверки поля, объект UploadedFile получает дополнительный атрибут image, который содержит экземпляр Image, используемый для проверка того, что файл содержит изображение. Атрибут UploadedFile.content_type также обновляется значением соответствующего типа контента, определённого библиотекой Pillow.
По умолчанию используется виджет NumberInput при Field.localize равном False, иначе TextInput.
Пустое значение: None.
Возвращает: Тип integer или long языка Python.
Проверяет, что полученное значение является целым числом. Пробелы до и после значения не влияют на преобразование значения, так как эта ситуация обрабатывается функцией int() языка Python.
Ключи сообщений об ошибках: required, invalid, max_value, min_value.
Сообщения об ошибках max_value и min_value могут содержать шаблон %(limit_value)s, который будет заполнен соответствующим значением.
Принимает два необязательных аргумента для проверки:
Они определяют диапазон значений, разрешённый для поля.
Не рекомендуется, начиная с версии 1.7: Это поле устарело, используйте GenericIPAddressField.
Стандартный виджет: TextInput
Пустое значение: '' (пустая строка).
Возвращает: Объект Unicode.
Проверяет с помощью регулярного выражения, что полученное значение является правильным IPv4 адресом.
Ключи сообщений об ошибках: required, invalid.
Поле для обработки адресов IPv4 или IPv6.
Стандартный виджет: TextInput
Пустое значение: '' (пустая строка).
Возвращает: Объект Unicode. Преобразование IPv6 адресов описано далее.
Проверяет, что полученное значение является правильным IP адресом.
Ключи сообщений об ошибках: required, invalid.
IPv6 адрес преобразуется в соответствии с RFC 4291, секция 2.2, включая использование формата IPv4, предложенного в параграфе 3 этой секции, вида ::ffff:192.0.2.0. Например, 2001:0::0:01 будет преобразован к 2001::1, а ::ffff:0a0a:0a0a к ::ffff:10.10.10.10. Все символы преобразуются в нижний регистр.
Принимает два необязательных аргумента:
Ограничивает диапазон значений указанным протоколом. Принимает значения: both (по умолчанию, т.е. “оба”), IPv4 или IPv6. Регистр букв не имеет значения.
Распаковывает IPv4 адреса вида ::ffff::192.0.2.1. Если эта опция активирована, то адрес будет преобразован в 192.0.2.1. По умолчанию опция отключена. Может использоваться только если protocol установлен в 'both'.
Стандартный виджет: SelectMultiple
Пустое значение: [] (пустой список).
Возвращает: Список объектов Unicode.
Проверяет, что каждое значение из полученного списка присутствует в списке вариантов.
Ключи сообщений об ошибках: required, invalid_choice, invalid_list.
Сообщение об ошибке invalid_choice может содержать %(value)s, которое будет замещено выбранным вариантом.
Принимает один дополнительный обязательный аргумент choices, аналогично полю ChoiceField.
Похоже на MultipleChoiceField, за исключением того, что TypedMultipleChoiceField принимает два дополнительных аргумента: coerce и empty_value.
Стандартный виджет: SelectMultiple
Пустое значение: Всё, что вы назовёте empty_value.
Возвращает: Список значений типа, который указан аргументом coerce.
Проверяет, что полученные значения присутствуют в списке вариантов и могут быть преобразованы в нужный тип.
Ключи сообщений об ошибках: required, invalid_choice.
Сообщение об ошибке invalid_choice может содержать %(value)s, которое будет замещено выбранным вариантом.
Принимает два дополнительных аргумента, coerce и empty_value, аналогично TypedChoiceField.
Стандартный виджет: NullBooleanSelect
Пустое значение: None.
Возвращает: True, False или None.
Ничего не проверяет, т.е. никогда не возвратит ValidationError.
Стандартный виджет: TextInput
Пустое значение: '' (пустая строка).
Возвращает: Объект Unicode.
Проверяет, что полученное значение совпадает с указанным регулярным выражением.
Ключи сообщений об ошибках: required, invalid.
Принимает один обязательный аргумент:
Регулярное выражение в виде строки или скомпилированного объекта регулярного выражения.
Также принимает аргументы max_length и min_length, которые работают аналогично CharField.
Не рекомендуется, начиная с версии 1.8: Необязательный аргумент error_message принимается в целях обратной совместимости, но будет удалён в Django 2.0. Предпочтительным способом указания собственного сообщения об ошибке является использование аргумента error_messages, которому назначается словарь с ключом invalid.
Стандартный виджет: TextInput
Пустое значение: '' (пустая строка).
Возвращает: Объект Unicode.
Проверяет, что полученное значение содержит только буквы, цифры, подчёркивания и тире.
Ключи сообщений об ошибках: required, invalid.
Это поле предназначено для представления поля модели SlugField на формах.
Стандартный виджет: TextInput
Пустое значение: None.
Возвращает: Объект datetime.time языка Python.
Проверяет, что переданное значение является объектом datetime.time или строкой, отформатированной в нужном виде.
Ключи сообщений об ошибках: required, invalid.
Принимает один необязательный аргумент:
Список форматов, используемых при попытках сконвертировать строку в объект datetime.time.
Если аргумент input_formats не предоставлен, то используются следующие форматы:
'%H:%M:%S', # '14:30:59'
'%H:%M', # '14:30'
Стандартный виджет: URLInput
Пустое значение: '' (пустая строка).
Возвращает: Объект Unicode.
Проверяет, что полученное значение является правильным URL.
Ключи сообщений об ошибках: required, invalid.
Принимает следующие необязательные аргументы:
Аналогичны CharField.max_length и CharField.min_length.
Стандартный виджет: TextInput
Пустое значение: '' (пустая строка).
Возвращает: Объект Unicode.
Проверяет, что полученное значение соответствует каждому полю, указанному в качестве аргумента ComboField.
Ключи сообщений об ошибках: required, invalid.
Принимает один дополнительный обязательный аргумент:
Список полей, которые должны использоваться для проверки значения поля (в порядке их определения).
>>> from django.forms import ComboField
>>> f = ComboField(fields=[CharField(max_length=20), EmailField()])
>>> f.clean('test@example.com')
'test@example.com'
>>> f.clean('longemailaddress@example.com')
Traceback (most recent call last):
...
ValidationError: ['Ensure this value has at most 20 characters (it has 28).']
Стандартный виджет: TextInput
Пустое значение: '' (пустая строка).
Возвращает: Тип, который вернёт метод compress().
Проверяет, что полученное значение соответствует полям, указанным в аргументе MultiValueField.
Ключи сообщений об ошибках: required, invalid, incomplete
Агрегирует логику нескольких полей, создавая единое значение.
Это поле является абстрактным и должно быть реализовано в собственном классе. В отличие от полей с единственным значением, дочерние классы MultiValueField не должны реализовывать метод clean(), вместо этого надо реализовать метод compress().
Принимает один дополнительный обязательный аргумент:
Кортеж полей, чьи значения очищаются и последовательно объединяются в единственное значение. Каждое значение поля проверяется соответствующим полем в fields. Первое значение обрабатывается первым полем, второе – вторым и так далее. После проверки всех полей, список значений “сжимается” в одно значений с помощью метода compress().
Принимает один необязательный аргумент:
По умолчанию True, в это случае будет получена ошибка валидации required, если хотя бы одно поле не содержит значения.
При False атрибут Field.required вложенных полей может быть False, делая их не обязательными. Если обязательное поле не содержит значения, оно вернет ошибку валидации incomplete.
Сообщение об ошибке incomplete может быть указано в дочернем классе MultiValueField, или индивидуально для каждого вложенного поля. Например:
from django.core.validators import RegexValidator
class PhoneField(MultiValueField):
def __init__(self, *args, **kwargs):
# Define one message for all fields.
error_messages = {
'incomplete': 'Enter a country calling code and a phone number.',
}
# Or define a different message for each field.
fields = (
CharField(error_messages={'incomplete': 'Enter a country calling code.'},
validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid country calling code.')]),
CharField(error_messages={'incomplete': 'Enter a phone number.'},
validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid phone number.')]),
CharField(validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.')],
required=False),
)
super(PhoneField, self).__init__(
error_messages=error_messages, fields=fields,
require_all_fields=False, *args, **kwargs)
Должен быть дочерним классом django.forms.MultiWidget.Значением по умолчанию является TextInput, который возможно не так полезен в этом случае.
Принимает список проверенных значений и возвращает в одном значении их “сжатую” версию. Например, SplitDateTimeField является дочерним классом, который объединяет поле времени с полем даты в объект datetime.
Этот метод должен быть реализован в дочерних классах.
Стандартный виджет: :class:SplitDateTimeWidget
Пустое значение: None.
Возвращает: Объект datetime.datetime языка Python.
Проверяет, что переданное значение является объектом datetime.datetime или строкой, отформатированной в нужном виде.
Ключи сообщений об ошибках: required, invalid, invalid_date, invalid_time.
Принимает два необязательных аргумента:
Список форматов, используемых при попытках сконвертировать строку в объект datetime.date.
Если аргумент input_date_formats не был предоставлен, то используются шаблоны аналогичные полю DateField.
Список форматов, используемых при попытках сконвертировать строку в объект datetime.time.
Если аргумент input_date_formats не был предоставлен, то используются шаблоны аналогичные полю TimeField.
Для представления связей между моделями предлагается два поля: ModelChoiceField and ModelMultipleChoiceField. Оба эти поля требуют наличие одного параметра queryset, который используется для создания вариантов значений для этого поля. При проверке формы эти поля заполняются одним объектом модели (в случае ModelChoiceField) или множеством объектов модели (в случае ModelMultipleChoiceField) в словаре cleaned_data формы.
Возможно указать queryset=None при определении поля, далее в конструкторе формы определить значение этого атрибута:
class FooMultipleChoiceForm(forms.Form):
foo_select = forms.ModelMultipleChoiceField(queryset=None)
def __init__(self, *args, **kwargs):
super(FooMultipleChoiceForm, self).__init__(*args, **kwargs)
self.fields['foo_select'].queryset = ...
Стандартный виджет: Select
Пустое значение: None.
Возвращает: Экземпляр модели.
Проверяет, что полученный идентификатор присутствует в выборке.
Ключи сообщений об ошибках: required, invalid_choice.
Позволяет выбор единственного объекта модели, имеет смысл при отображении внешнего ключа. Следует отметить, что стандартный виджет для ModelChoiceField становится непрактичным когда число его значений растёт. Сотня значений уже становится проблемой.
Единственный обязательный аргумент:
Объект QuerySet содержит выборку объектов модели, которые являются значениями для этого поля и которые будут использоваться для проверки полученных данных.
ModelChoiceField принимает два необязательных аргумента:
По умолчанию виджет <select>, используемый полем ModelChoiceField, содержит пустой вариант в начале списка. Вы можете изменить текстовую метку для этого варианта (по умолчанию это "---------") с помощью атрибута empty_label. Также вы можете исключить пустой вариант из списка поря, назначив None параметру empty_label:
# A custom empty label
field1 = forms.ModelChoiceField(queryset=..., empty_label="(Nothing)")
# No empty label
field2 = forms.ModelChoiceField(queryset=..., empty_label=None)
Следует отметить, что если ModelChoiceField является обязательным и имеет начальное значение, то пустой вариант отсутствует для такого поля, вне зависимости от значения аргумента empty_label.
Этот необязательный параметр позволяет указать поле модели, которое будет использоваться для определения значения. Поле должно быть уникальным, чтобы выбранное значение не соответствовало нескольким объектам. По умолчанию равно None, в этом случае используется первичный ключ. Например:
# No custom to_field_name
field1 = forms.ModelChoiceField(queryset=...)
вернет:
<select id="id_field1" name="field1">
<option value="obj1.pk">Object1</option>
<option value="obj2.pk">Object2</option>
...
</select>
и:
# to_field_name provided
field2 = forms.ModelChoiceField(queryset=..., to_field_name="name")
вернет:
<select id="id_field2" name="field2">
<option value="obj1.name">Object1</option>
<option value="obj2.name">Object2</option>
...
</select>
При генерации текстового представления варианта используется метод __str__``(или ``__unicode__ для Python 2) модели. Для получения собственного представления, следует унаследовать ModelChoiceField и переопределить метод label_from_instance. Этот метод получает объект модели и должен возвратить соответствующую строку. Например:
from django.forms import ModelChoiceField
class MyModelChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
return "My Object #%i" % obj.id
Стандартный виджет: SelectMultiple
Пустое значение: Пустой QuerySet (self.queryset.none())
Возвращает: Выборку с экземплярами модели.
Проверяет, что каждый идентификатор полученного списка значений присутствует в выборке.
Ключи сообщений об ошибках: required, list, invalid_choice, invalid_pk_value.
Сообщение об ошибке invalid_choice может включать %(value)s,а invalid_pk_value – %(pk)s.
Позволяет выбрать один или несколько объектов модели. Подходит для представления отношения “многие-ко-многим”. Аналогично ModelChoiceField, вы можете использовать label_from_instance для управления текстовым представлением объекта. Параметр queryset является обязательным:
Объект QuerySet содержит выборку объектов модели, которые являются значениями для этого поля и которые будут использоваться для проверки полученных данных.
Если встроенные классы Field не подходят к вашей задаче, вы легко можете создать свои собственные. Для того, чтобы сделать это просто унаследуйте ваш класс от django.forms.Field. Класс должен реализовывать метод clean() и его конструктор должен принимать обязательные аргументы, т.е., required, label, initial, widget, help_text.
Jun 02, 2016