Поля форм
-
class Field(**kwargs)
При создании класса Form, важнейшей частью является определение полей формы. Каждое поле имеет собственную логику валидации, а также несколько других хуков.
-
Field.clean(value)
Хотя основной способ использования классов 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 принимают дополнительные, специфичные для поля аргументы, но следующие должны всегда приниматься:
required
-
Field.required
По умолчанию каждый класс 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() пустое значение, то clean() вернёт нормализованное пустое значение, а не генерирует исключение ValidationError. Для CharField, это будет пустая строка. Для других классов Field, это может быть None. (Это зависит от поля.)
У виджетов обязательных полей формы есть атрибут HTML required. Установите атрибут Form.use_required_attribute в False, чтобы отключить его. Атрибут required не включён в формы formsets, так как валидация браузера может быть некорректной при добавлении и удалении formsets.
label
-
Field.label
Аргумент label позволяет указать "человеко-понятный" ярлык для этого поля. Он используется, когда поле Field отображается в Form.
Как объяснялось в разделе "Вывод форм в виде HTML" выше, ярлык по умолчанию для Field генерируется из имени поля путём преобразования всех нижних подчеркиваний в пробелы и верхнего регистра первой буквы. Укажите label , если это поведение по умолчанию не приводит к адекватному ярлыку.
Вот полный пример Form, который реализует label для двух его полей. Мы указали auto_id=False для упрощения вывода:
>>> from django import forms >>> class CommentForm(forms.Form): ... name = forms.CharField(label='Your name') ... url = forms.URLField(label='Your website', required=False) ... comment = forms.CharField() >>> f = CommentForm(auto_id=False) >>> print(f) <tr><th>Your name:</th><td><input type="text" name="name" required></td></tr> <tr><th>Your website:</th><td><input type="url" name="url"></td></tr> <tr><th>Comment:</th><td><input type="text" name="comment" required></td></tr>
label_suffix
-
Field.label_suffix
Аргумент 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" required></p> <p><label for="id_nationality">Nationality?</label> <input id="id_nationality" name="nationality" type="text" required></p> <p><label for="id_captcha_answer">2 + 2 =</label> <input id="id_captcha_answer" name="captcha_answer" type="number" required></p>
initial
-
Field.initial
Аргумент initial позволяет указать начальное значение, которое следует использовать при отображении этого Field в несвязанной Form.
Для указания динамических начальных данных см. параметр 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" required></td></tr> <tr><th>Url:</th><td><input type="url" name="url" value="http://" required></td></tr> <tr><th>Comment:</th><td><input type="text" name="comment" required></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" required></td></tr>
<tr><th>Url:</th><td><ul class="errorlist"><li>Enter a valid URL.</li></ul><input type="url" name="url" value="http://" required></td></tr>
<tr><th>Comment:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="comment" required></td></tr>
Вот почему значения initial отображаются только для несвязанных форм. Для связанных форм вывод HTML будет использовать связанные данные.
Также обратите внимание, что значения initial не используются в качестве «резервных» данных при валидации, если значение конкретного поля не указано. Значения 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.']}
Вместо константы вы также можете передать любой вызываемый объект:
>>> 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" required><td></tr>
Вызываемый объект будет вычисляться только при отображении несвязанной формы, а не при её определении.
widget
-
Field.widget
Аргумент widget позволяет указать класс Widget для использования при отображении этого Field. См. Виджеты для получения дополнительной информации.
help_text
-
Field.help_text
Аргумент help_text позволяет указать описательный текст для этого Field. Если вы предоставите help_text, он будет отображаться рядом с Field при рендеринге Field одним из удобных методов Form (например, as_ul()).
Как и в атрибуте help_text поля модели, это значение не экранируется HTML в автоматически генерируемых формах.
Вот полный пример Form, который реализует 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" required><br><span class="helptext">100 characters max.</span></td></tr> <tr><th>Message:</th><td><input type="text" name="message" required></td></tr> <tr><th>Sender:</th><td><input type="email" name="sender" required><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" required> <span class="helptext">100 characters max.</span></li> <li>Message: <input type="text" name="message" required></li> <li>Sender: <input type="email" name="sender" required> 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" required> <span class="helptext">100 characters max.</span></p> <p>Message: <input type="text" name="message" required></p> <p>Sender: <input type="email" name="sender" required> A valid email address, please.</p> <p>Cc myself: <input type="checkbox" name="cc_myself"></p>
error_messages
-
Field.error_messages
Аргумент 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']
В разделе встроенные классы полей ниже, каждый Field определяет ключи сообщений об ошибках, которые он использует.
validators
-
Field.validators
Аргумент validators позволяет указать список функций валидации для этого поля.
См. документацию по валидаторам для получения дополнительной информации.
localize
-
Field.localize
Аргумент localize позволяет выполнить локализацию ввода данных формы, а также выводимого результата.
См. документацию форматирования локализации для получения дополнительной информации.
disabled
-
Field.disabled
Логический аргумент disabled, при установке в значение True, отключает поле формы, используя атрибут HTML disabled, так что оно не может быть изменено пользователями. Даже если пользователь изменяет значение поля, отправленное на сервер, оно будет проигнорировано в пользу значения из начальных данных формы.
Проверка изменения данных поля
has_changed()
-
Field.has_changed()
Метод has_changed() используется для определения, изменилось ли значение поля со значения начального значения. Возвращает True или False.
См. документацию Form.has_changed() для получения дополнительной информации.
Встроенные классы Field
Библиотека forms поставляется с набором классов Field, которые представляют собой распространённые требования к валидации. В этом разделе описывается каждое встроенное поле.
Для каждого поля мы описываем виджет по умолчанию, если вы не указали widget. Мы также укажем значение, возвращаемое при вводе пустого значения (см. раздел о required выше, чтобы понять, что это значит).
BooleanField
-
class BooleanField(**kwargs) -
- Виджет по умолчанию:
CheckboxInput - Пустое значение:
False - Нормализуется до: значения Python
TrueилиFalse. - Валидирует, что значение равно
True(например, флажок отмечен), если поле имеетrequired=True. - Ключи сообщений об ошибках:
required
Примечание
Поскольку все подклассы
Fieldпо умолчанию имеютrequired=True, условие валидации здесь важно. Если вы хотите включить в свою форму булево значение, которое может быть либоTrue, либоFalse(например, галочка установлена или снята), вы должны помнить о передачеrequired=Falseпри созданииBooleanField. - Виджет по умолчанию:
CharField
-
class CharField(**kwargs) -
- Значение по умолчанию виджета:
TextInput - Значение пустого поля: то, что вы задали как
empty_value. - Нормализуется до: Строка.
- Использует
MaxLengthValidatorиMinLengthValidator, еслиmax_lengthиmin_lengthзаданы. В противном случае все входные данные допустимы. - Ключи сообщений об ошибках:
required,max_length,min_length
Имеет три необязательных аргумента для валидации:
-
max_length
-
min_length
При указании эти аргументы гарантируют, что строка имеет не более или не менее указанной длины.
-
strip -
Если
True(по умолчанию), значение будет очищено от начальных и конечных пробелов.
-
empty_value -
Значение, используемое для представления «пустого» значения. По умолчанию — пустая строка.
- Значение по умолчанию виджета:
ChoiceField
-
class ChoiceField(**kwargs) -
- Значение по умолчанию виджета:
Select - Значение пустого поля:
''(пустая строка) - Нормализуется до: Строка.
- Проверяет, что заданное значение существует в списке вариантов.
- Ключи сообщений об ошибках:
required,invalid_choice
Сообщение об ошибке «
invalid_choice» может содержать%(value)s, которое будет заменено выбранным вариантом.Принимает один дополнительный аргумент:
-
choices -
Итерируемый объект из 2-х кортежей, используемых в качестве вариантов для этого поля, варианты перечисления или функция, возвращающая такой итерируемый объект. Этот аргумент принимает те же форматы, что и аргумент
choicesдля поля модели. Дополнительные сведения см. в документации по полю модели по параметрам выбора. Если аргумент является вызываемым объектом, он вычисляется каждый раз при инициализации формы поля. По умолчанию — пустой список.
- Значение по умолчанию виджета:
TypedChoiceField
-
class TypedChoiceField(**kwargs) -
Аналогично
ChoiceField, за исключением того, чтоTypedChoiceFieldпринимает два дополнительных аргумента,coerceиempty_value.- Значение по умолчанию виджета:
Select - Значение пустого поля: то, что вы задали как
empty_value. - Нормализуется до: значения типа, указанного аргументом
coerce. - Проверяет, что заданное значение существует в списке вариантов и может быть преобразовано.
- Ключи сообщений об ошибках:
required,invalid_choice
Принимает дополнительные аргументы:
-
coerce -
Функция, принимающая одно значение и возвращающая преобразованное значение. Примеры включают встроенные
int,float,boolи другие типы. По умолчанию — функция тождества. Обратите внимание, что приведение типов выполняется после проверки входных данных, поэтому можно привести к значению, отсутствующему вchoices.
-
empty_value -
Значение, используемое для представления «пустого» значения. По умолчанию — пустая строка;
None— ещё один распространённый выбор. Обратите внимание, что это значение не будет преобразовано функцией, указанной в аргументеcoerce, поэтому выберите его соответственно.
- Значение по умолчанию виджета:
DateField
-
class DateField(**kwargs) -
- Значение по умолчанию виджета:
DateInput - Значение пустого поля:
None - Нормализуется до: объект Python
datetime.date. - Проверяет, что заданное значение — это
datetime.date,datetime.datetimeили строка, отформатированная в определённом формате даты. - Ключи сообщений об ошибках:
required,invalid
Принимает один необязательный аргумент:
-
input_formats -
Список форматов, используемых для попытки преобразования строки в допустимый объект
datetime.date.
Если аргумент
input_formatsне указан, форматы входных данных берутся изDATE_INPUT_FORMATS, еслиUSE_L10Nимеет значениеFalse, или из формата активного языкаDATE_INPUT_FORMATSпри включённой локализации. См. также локализация форматов. - Значение по умолчанию виджета:
DateTimeField
-
class DateTimeField(**kwargs) -
- Значение по умолчанию виджета:
DateTimeInput - Значение пустого поля:
None - Нормализуется до: объект Python
datetime.datetime. - Проверяет, что заданное значение — это
datetime.datetime,datetime.dateили строка, отформатированная в определённом формате даты и времени. - Ключи сообщений об ошибках:
required,invalid
Принимает один необязательный аргумент:
-
input_formats -
Список форматов, используемых для попытки преобразования строки в допустимый объект
datetime.datetime.
Если аргумент
input_formatsне указан, форматы входных данных берутся изDATETIME_INPUT_FORMATS, еслиUSE_L10Nимеет значениеFalse, или из формата активного языкаDATETIME_INPUT_FORMATSпри включённой локализации. См. также локализация форматов. - Значение по умолчанию виджета:
DecimalField
-
class DecimalField(**kwargs) -
- Значение по умолчанию виджета:
NumberInputеслиField.localizeимеет значениеFalse, иначеTextInput. - Значение пустого поля:
None - Нормализуется до: объект Python
decimal. - Проверяет, что заданное значение является десятичным. Использует
MaxValueValidatorиMinValueValidator, еслиmax_valueиmin_valueзаданы. Начальные и конечные пробелы игнорируются. - Ключи сообщений об ошибках:
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.Принимает четыре необязательных аргумента:
-
max_value
-
min_value -
Они управляют диапазоном допустимых значений в поле и должны быть заданы как значения
decimal.Decimal.
-
max_digits -
Максимальное количество цифр (до и после десятичной точки, при этом ведущие нули отбрасываются) разрешённых в значении.
-
decimal_places -
Максимальное количество десятичных знаков.
- Значение по умолчанию виджета:
DurationField
-
class DurationField(**kwargs) -
- Значение по умолчанию виджета:
TextInput - Пустое значение:
None - Нормализуется до: объекта Python
timedelta. - Проверяет, что заданное значение является строкой, которая может быть преобразована в
timedelta. Значение должно быть междуdatetime.timedelta.minиdatetime.timedelta.max. - Ключи сообщений об ошибках:
required,invalid,overflow.
Принимает любой формат, понятный
parse_duration(). - Значение по умолчанию виджета:
EmailField
-
class EmailField(**kwargs) -
- Значение по умолчанию виджета:
EmailInput - Пустое значение:
''(пустая строка) - Нормализуется до: Строки.
- Использует
EmailValidatorдля проверки того, что заданное значение является корректным электронным адресом, используя достаточно сложную регулярную выражение. - Ключи сообщений об ошибках:
required,invalid
Имеет два необязательных аргумента для валидации,
max_lengthиmin_length. Если они указаны, эти аргументы гарантируют, что строка не превышает или не меньше заданной длины. - Значение по умолчанию виджета:
FileField
-
class FileField(**kwargs) -
- Значение по умолчанию виджета:
ClearableFileInput - Пустое значение:
None - Нормализуется до: объекта
UploadedFile, который объединяет содержимое файла и имя файла в один объект. - Может проверять, что данные непустого файла были связаны с формой.
- Ключи сообщений об ошибках:
required,invalid,missing,empty,max_length
Имеет два необязательных аргумента для валидации,
max_lengthиallow_empty_file. Если они указаны, эти аргументы гарантируют, что длина имени файла не превышает заданную длину, и что проверка будет успешной, даже если содержимое файла пустое.Чтобы узнать больше об объекте
UploadedFile, см. документацию по загрузке файлов.При использовании
FileFieldв форме, вы также должны помнить о связывании данных загружаемого файла с формой.Ошибка
max_lengthотносится к длине имени файла. В сообщении об ошибке для этого ключа%(max)dбудет заменено максимальной длиной имени файла, а%(length)d— текущей длиной имени файла. - Значение по умолчанию виджета:
FilePathField
-
class FilePathField(**kwargs) -
- Значение по умолчанию виджета:
Select - Пустое значение:
''(пустая строка) - Нормализуется до: Строки.
- Проверяет, что выбранный элемент существует в списке вариантов.
- Ключи сообщений об ошибках:
required,invalid_choice
Поле позволяет выбрать файлы внутри определённого каталога. Оно принимает пять дополнительных аргументов; только
pathобязателен:-
path -
Абсолютный путь к каталогу, содержимое которого нужно перечислить. Этот каталог должен существовать.
-
recursive -
Если
False(по умолчанию) предлагаются только прямые элементы каталогаpath. ЕслиTrue, каталог будет рекурсивно исследован, и все его потомки будут перечислены в качестве вариантов.
-
match -
Шаблон регулярного выражения; только файлы с именами, соответствующими этому выражению, будут разрешены в качестве вариантов.
-
allow_files -
Необязательно. Либо
TrueлибоFalse. По умолчаниюTrue. Указывает, должны ли файлы в указанном месте быть включены. Либо это, либоallow_foldersдолжно бытьTrue.
-
allow_folders -
Необязательно. Либо
TrueлибоFalse. По умолчаниюFalse. Указывает, должны ли папки в указанном месте быть включены. Либо это, либоallow_filesдолжно бытьTrue.
- Значение по умолчанию виджета:
FloatField
-
class FloatField(**kwargs) -
- Значение по умолчанию виджета:
NumberInputприField.localizeравноFalse, в противном случаеTextInput. - Пустое значение:
None - Нормализуется до: числа с плавающей точкой Python.
- Проверяет, что заданное значение является числом с плавающей точкой. Использует
MaxValueValidatorиMinValueValidator, еслиmax_valueиmin_valueуказаны. Разрешаются ведущие и хвостовые пробелы, как в функции Pythonfloat(). - Ключи сообщений об ошибках:
required,invalid,max_value,min_value
Принимает два необязательных аргумента для проверки,
max_valueиmin_value. Они контролируют диапазон значений, разрешённых в поле. - Значение по умолчанию виджета:
ImageField
-
class ImageField(**kwargs) -
- Значение по умолчанию виджета:
ClearableFileInput - Пустое значение:
None - Нормализуется до: объекта
UploadedFile, который объединяет содержимое файла и имя файла в один объект. - Проверяет, что данные файла были связаны с формой. Также использует
FileExtensionValidatorдля проверки того, что расширение файла поддерживается Pillow. - Ключи сообщений об ошибках:
required,invalid,missing,empty,invalid_image
Использование
ImageFieldтребует установки Pillow с поддержкой используемых вами форматов изображений. Если при загрузке изображения вы столкнулись с ошибкойcorrupt image, это, как правило, означает, что Pillow не понимает его формат. Для исправления этого установите соответствующую библиотеку и переустановите Pillow.При использовании
ImageFieldв форме, вы также должны помнить о связывании данных загружаемого файла с формой.После очистки и валидации поля, объект
UploadedFileбудет иметь дополнительный атрибутimage, содержащий экземпляр Pillow Image, используемый для проверки, был ли файл действительным изображением. Pillow закрывает дескриптор базового файла после проверки изображения, поэтому, хотя атрибуты данных, не являющихся изображениями, такие какformat,height, иwidth, доступны, методы, которые обращаются к данным базового изображения, такие какgetdata()илиgetpixel(), нельзя использовать без повторного открытия файла. Например:>>> from PIL import Image >>> from django import forms >>> from django.core.files.uploadedfile import SimpleUploadedFile >>> class ImageForm(forms.Form): ... img = forms.ImageField() >>> file_data = {'img': SimpleUploadedFile('test.png', <file data>)} >>> form = ImageForm({}, file_data) # Pillow closes the underlying file descriptor. >>> form.is_valid() True >>> image_field = form.cleaned_data['img'] >>> image_field.image <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=191x287 at 0x7F5985045C18> >>> image_field.image.width 191 >>> image_field.image.height 287 >>> image_field.image.format 'PNG' >>> image_field.image.getdata() # Raises AttributeError: 'NoneType' object has no attribute 'seek'. >>> image = Image.open(image_field) >>> image.getdata() <ImagingCore object at 0x7f5984f874b0>Кроме того,
UploadedFile.content_typeбудет обновлён с типом содержимого изображения, если Pillow может его определить, в противном случае он будет установлен вNone. - Значение по умолчанию виджета:
IntegerField
-
class IntegerField(**kwargs) -
- Значение по умолчанию виджета:
NumberInput, когдаField.localizeравноFalse, иначеTextInput. - Пустое значение:
None - Нормализуется до: целого числа Python.
- Проверяет, является ли заданное значение целым числом. Использует
MaxValueValidatorиMinValueValidator, еслиmax_valueиmin_valueзаданы. Разрешаются начальные и конечные пробелы, как в функции Pythonint(). - Ключи сообщений об ошибках:
required,invalid,max_value,min_value
Сообщения об ошибках
max_valueиmin_valueмогут содержать%(limit_value)s, которое будет заменено соответствующим пределом.Принимает два необязательных аргумента для проверки:
-
max_value
-
min_value
Эти аргументы задают диапазон допустимых значений поля.
- Значение по умолчанию виджета:
GenericIPAddressField
-
class GenericIPAddressField(**kwargs) -
Поле, содержащее адрес IPv4 или IPv6.
- Значение по умолчанию виджета:
TextInput - Пустое значение:
''(пустая строка) - Нормализуется до: Строка. Адреса IPv6 нормализуются, как описано ниже.
- Проверяет, является ли заданное значение корректным IP-адресом.
- Ключи сообщений об ошибках:
required,invalid
Нормализация адресов IPv6 следует RFC 4291#section-2.2 раздел 2.2, включая использование формата IPv4, предложенного в абзаце 3 этого раздела, например,
::ffff:192.0.2.0. Например,2001:0::0:01будет нормализован до2001::1, а::ffff:0a0a:0a0aдо::ffff:10.10.10.10. Все символы приводятся к нижнему регистру.Принимает два необязательных аргумента:
-
protocol -
Ограничивает допустимые вводы указанным протоколом. Допустимые значения:
both(по умолчанию),IPv4илиIPv6. Сопоставление регистронезависимое.
-
unpack_ipv4 -
Распаковывает адреса IPv4 с отображением, например
::ffff:192.0.2.1. Если этот параметр включен, адрес будет распакован до192.0.2.1. По умолчанию отключено. Может использоваться только когдаprotocolустановлено в'both'.
- Значение по умолчанию виджета:
MultipleChoiceField
-
class MultipleChoiceField(**kwargs) -
- Значение по умолчанию виджета:
SelectMultiple - Пустое значение:
[](пустой список) - Нормализуется до: Список строк.
- Проверяет, что каждое значение в данном списке значений существует в списке вариантов.
- Ключи сообщений об ошибках:
required,invalid_choice,invalid_list
Сообщение об ошибке
invalid_choiceможет содержать%(value)s, которое будет заменено выбранным вариантом.Принимает один дополнительный обязательный аргумент,
choices, как дляChoiceField. - Значение по умолчанию виджета:
TypedMultipleChoiceField
-
class TypedMultipleChoiceField(**kwargs) -
Подобно
MultipleChoiceField, за исключением того, чтоTypedMultipleChoiceFieldпринимает два дополнительных аргумента,coerceиempty_value.- Значение по умолчанию виджета:
SelectMultiple - Пустое значение: то, что вы указали как
empty_value - Нормализуется до: Список значений типа, предоставленного аргументом
coerce. - Проверяет, что заданные значения находятся в списке вариантов и могут быть приведены к нужному типу.
- Ключи сообщений об ошибках:
required,invalid_choice
Сообщение об ошибке
invalid_choiceможет содержать%(value)s, которое будет заменено выбранным значением.Принимает два дополнительных аргумента,
coerceиempty_value, как и дляTypedChoiceField. - Значение по умолчанию виджета:
NullBooleanField
-
class NullBooleanField(**kwargs) -
- Значение по умолчанию виджета:
NullBooleanSelect - Пустое значение:
None - Нормализуется до: значение Python
True,FalseилиNone. - Не выполняет проверки (т.е. никогда не вызывает
ValidationError).
- Значение по умолчанию виджета:
RegexField
-
class RegexField(**kwargs) -
- Значение по умолчанию виджета:
TextInput - Пустое значение:
''(пустая строка) - Нормализуется до: Строка.
- Использует
RegexValidatorдля проверки, соответствует ли заданное значение определенному регулярному выражению. - Ключи сообщений об ошибках:
required,invalid
Принимает один обязательный аргумент:
-
regex -
Регулярное выражение, заданное либо в виде строки, либо в виде объекта скомпилированного регулярного выражения.
Также принимает
max_length,min_length, иstrip, которые работают так же, как и дляCharField.-
strip -
По умолчанию
False. Если включено, удаление пробелов будет применено перед проверкой регулярного выражения.
- Значение по умолчанию виджета:
SlugField
-
class SlugField(**kwargs) -
- Значение по умолчанию виджета:
TextInput - Пустое значение:
''(пустая строка) - Нормализуется до: Строка.
- Использует
validate_slugилиvalidate_unicode_slugдля проверки, содержит ли заданное значение только буквы, цифры, подчеркивания и дефисы. - Сообщения об ошибках:
required,invalid
Это поле предназначено для использования при представлении модели
SlugFieldв формах.Принимает необязательный параметр:
-
allow_unicode -
Логическое значение, указывающее, что поле должно принимать символы Unicode в дополнение к символам ASCII. По умолчанию
False.
- Значение по умолчанию виджета:
TimeField
-
class TimeField(**kwargs) -
- Значение по умолчанию виджета:
TimeInput - Пустое значение:
None - Нормализуется до: Объект Python
datetime.time. - Проверяет, является ли заданное значение объектом времени
datetime.timeили строкой, отформатированной в определенном формате времени. - Ключи сообщений об ошибках:
required,invalid
Принимает один необязательный аргумент:
-
input_formats -
Список форматов, используемых для попытки преобразования строки в допустимый объект
datetime.time.
Если аргумент
input_formatsне указан, форматы ввода по умолчанию берутся изTIME_INPUT_FORMATS, еслиUSE_L10NравноFalse, или из активного формата локализацииTIME_INPUT_FORMATSключа, если локализация включена. См. также форматирование локализации. - Значение по умолчанию виджета:
URLField
-
class URLField(**kwargs) -
- Значение по умолчанию виджета:
URLInput - Пустое значение:
''(пустая строка) - Нормализуется в: Строку.
- Использует
URLValidatorдля проверки того, является ли заданное значение допустимым URL. - Ключи сообщений об ошибках:
required,invalid
Принимает следующие необязательные аргументы:
-
max_length
-
min_length
Эти параметры аналогичны
CharField.max_lengthиCharField.min_length. - Значение по умолчанию виджета:
UUIDField
-
class UUIDField(**kwargs) -
- Значение по умолчанию виджета:
TextInput - Пустое значение:
''(пустая строка) - Нормализуется в: Объект
UUID. - Ключи сообщений об ошибках:
required,invalid
Это поле примет любой формат строки, принятый в качестве аргумента
hexконструкторуUUID. - Значение по умолчанию виджета:
Несколько сложные встроенные Field классы
ComboField
-
class ComboField(**kwargs) -
- Значение по умолчанию виджета:
TextInput - Пустое значение:
''(пустая строка) - Нормализуется в: Строку.
- Проверяет заданное значение на соответствие каждому из полей, указанных в качестве аргумента для
ComboField. - Ключи сообщений об ошибках:
required,invalid
Требуется один дополнительный аргумент:
-
fields -
Список полей, которые должны использоваться для проверки значения поля (в порядке их предоставления).
>>> 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).']
- Значение по умолчанию виджета:
MultiValueField
-
class MultiValueField(fields=(), **kwargs) -
- Значение по умолчанию виджета:
TextInput - Пустое значение:
''(пустая строка) - Нормализуется в: тип, возвращаемый методом
compressподкласса. - Проверяет заданное значение на соответствие каждому из полей, указанных в качестве аргумента для
MultiValueField. - Ключи сообщений об ошибках:
required,invalid,incomplete
Агрегирует логику нескольких полей, которые вместе образуют одно значение.
Это абстрактное поле и должно быть подклассом. В отличие от полей с одним значением, подклассы
MultiValueFieldне должны реализовыватьclean(), а вместо этого - реализовыватьcompress().Требуется один дополнительный аргумент:
-
fields -
Кортеж полей, значения которых очищаются и объединяются в одно значение. Каждое значение поля очищается соответствующим полем в
fields– первое значение очищается первым полем, второе значение очищается вторым полем и т.д. После очистки всех полей список очищенных значений объединяется в одно значение с помощьюcompress().
Также принимаются некоторые необязательные аргументы:
-
require_all_fields -
По умолчанию
True, в этом случае ошибка валидацииrequiredбудет поднята, если не будет предоставлено значение для любого поля.Когда установлено
False, атрибутField.requiredможно установить вFalseдля отдельных полей, чтобы сделать их необязательными. Если для обязательного поля не будет предоставлено значение, будет поднята ошибка валидацииincomplete.Пользовательское сообщение об ошибке
incompleteможно определить в подклассеMultiValueField, или разные сообщения можно определить для каждого отдельного поля. Например:from django.core.validators import RegexValidator class PhoneField(MultiValueField): def __init__(self, **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().__init__( error_messages=error_messages, fields=fields, require_all_fields=False, **kwargs )
-
widget -
Должен быть подклассом
django.forms.MultiWidget. Значение по умолчанию –TextInput, что, вероятно, не очень полезно в данном случае.
-
compress(data_list) -
Принимает список допустимых значений и возвращает «сжатую» версию этих значений – в одном значении. Например,
SplitDateTimeField- подкласс, который объединяет поле времени и поле даты в объектdatetime.Этот метод должен быть реализован в подклассах.
- Значение по умолчанию виджета:
SplitDateTimeField
-
class SplitDateTimeField(**kwargs) -
- Значение по умолчанию виджета:
SplitDateTimeWidget - Пустое значение:
None - Нормализуется в: Объект Python
datetime.datetime. - Проверяет, что заданное значение является объектом
datetime.datetimeили строкой, отформатированной в определенном формате даты и времени. - Ключи сообщений об ошибках:
required,invalid,invalid_date,invalid_time
Принимает два необязательных аргумента:
-
input_date_formats -
Список форматов, используемых для попытки преобразования строки в допустимый объект
datetime.date.
Если аргумент
input_date_formatsне предоставлен, используются форматы ввода по умолчанию дляDateField.-
input_time_formats -
Список форматов, используемых для попытки преобразования строки в допустимый объект
datetime.time.
Если аргумент
input_time_formatsне предоставлен, используются форматы ввода по умолчанию дляTimeField. - Значение по умолчанию виджета:
Поля, обрабатывающие отношения
Для представления отношений между моделями доступны два поля: ModelChoiceField и ModelMultipleChoiceField. Оба этих поля требуют единственного параметра queryset, используемого для создания вариантов для поля. При проверке формы эти поля разместят либо один объект модели (в случае ModelChoiceField) либо несколько объектов модели (в случае ModelMultipleChoiceField) в словаре cleaned_data формы.
Для более сложных случаев вы можете указать queryset=None, при объявлении поля формы, а затем заполнить queryset в методе __init__() формы:
class FooMultipleChoiceForm(forms.Form):
foo_select = forms.ModelMultipleChoiceField(queryset=None)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['foo_select'].queryset = ...
ModelChoiceField
-
class ModelChoiceField(**kwargs) -
- По умолчанию виджет:
Select - Пустое значение:
None - Нормализуется в: Экземпляр модели.
- Проверяет, что заданный id существует в наборе запросов.
- Ключи сообщений об ошибках:
required,invalid_choice
Позволяет выбрать один объект модели, подходящий для представления внешнего ключа. Обратите внимание, что виджет по умолчанию для
ModelChoiceFieldстановится непрактичным при увеличении количества записей. Не следует использовать его для более чем 100 элементов.Требуется один аргумент:
-
queryset -
A
QuerySetобъектов модели, из которых выбираются значения для поля, и которая используется для проверки выбора пользователя. Вычисляется при отображении формы.
Также
ModelChoiceFieldпринимает два необязательных аргумента:-
empty_label -
По умолчанию виджет
<select>, используемыйModelChoiceField, будет иметь пустой выбор в верхней части списка. Вы можете изменить текст этой метки (по умолчанию"---------") с помощью атрибутаempty_label, или полностью отключить пустую метку, установивempty_labelвNone.# A custom empty label field1 = forms.ModelChoiceField(queryset=..., empty_label="(Nothing)") # No empty label field2 = forms.ModelChoiceField(queryset=..., empty_label=None)
Обратите внимание, что если требуется
ModelChoiceFieldи имеет значение по умолчанию, пустой выбор не создается (независимо от значенияempty_label).
-
to_field_name -
Этот необязательный аргумент используется для указания поля, которое должно использоваться в качестве значения выборов в виджете поля. Убедитесь, что это уникальное поле для модели, иначе выбранное значение может соответствовать более чем одному объекту. По умолчанию он установлен на
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__()модели будет вызван для генерации строковых представлений объектов для использования в вариантах поля. Для предоставления настраиваемых представлений подклассируйтеModelChoiceFieldи переопределитеlabel_from_instance. Этот метод получит объект модели и должен вернуть строку, подходящую для его представления. Например:from django.forms import ModelChoiceField class MyModelChoiceField(ModelChoiceField): def label_from_instance(self, obj): return "My Object #%i" % obj.id - По умолчанию виджет:
ModelMultipleChoiceField
-
class ModelMultipleChoiceField(**kwargs) -
- По умолчанию виджет:
SelectMultiple - Пустое значение: Пустой набор
QuerySet(self.queryset.none()) - Нормализуется в: Список экземпляров моделей.
- Проверяет, что каждый id в заданном списке значений существует в наборе запросов.
- Ключи сообщений об ошибках:
required,list,invalid_choice,invalid_pk_value
Сообщение
invalid_choiceможет содержать%(value)s, а сообщениеinvalid_pk_valueможет содержать%(pk)s, которые будут заменены соответствующими значениями.Позволяет выбрать один или несколько объектов модели, подходящий для представления взаимосвязи многие ко многим. Как и в случае с
ModelChoiceField, вы можете использоватьlabel_from_instanceдля настройки представлений объектов.Требуется один аргумент:
-
queryset -
Так же, как и
ModelChoiceField.queryset.
Принимает один необязательный аргумент:
-
to_field_name -
Так же, как и
ModelChoiceField.to_field_name.
- По умолчанию виджет:
Создание пользовательских полей
Если встроенные классы Field не соответствуют вашим потребностям, вы можете создать пользовательские классы Field. Для этого создайте подкласс django.forms.Field. Единственные требования к нему заключаются в реализации метода clean() и том, что метод __init__() принимает основные аргументы, упомянутые выше (required, label, initial, widget, help_text).
Вы также можете настроить доступ к полю, переопределив get_bound_field().
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.0/ref/forms/fields/