необязательное поле django формы
Django Book: изменение полей на необязательные
После того как вы немного поработаете с панелью управления вы, возможно, заметите некоторые ограничения, например — форма редактирования записи требует, что бы все поля были заполнены, хотя в некоторых случаях вы хотели бы оставить их пустыми. Например, вы хотите что бы поле email модели Authors было не обязательным для заполнения (опциональным).
После того как вы добавили blank=True — перезагрузите страницу «Add author» и вы увидите, что поле Email больше не выделено жирным шрифтом. Теперь вы можете добавить нового автора без указания адреса почты — сообщений «This field is required» больше не будет.
Изменение даты и числовых полей
Описанный пример с blank=True подойдёт и для полей даты и чисел, но тут требуется дополнительное пояснение и действие.
В SQL значение NULL отличается от пустой строки, так как же специальный объект None в Python отличается от пустой строки («»). Это значит, что некоторые символьные поля (такие как VARCHAR ) могут содержать значения и NULL и пустые строки.
Это может вызвать нежелательную двусмысленность и путаницу: «Почему эта запись имеет значение NULL, а другая — пустую строку?» и «Как мне получить все записи с пустыми значениями — должен ли я искать и NULL и пустые строки, или только пустые строки?»
Что бы избежать такой путаницы — сгенерированный Django запрос CREATE TABLE (который мы рассматривали в предыдущей главе) добавляет явное указание NOT NULL для описания каждой колонки. Например, вот запрос для нашей модели Author :
Как правило это оптимальное решение для ваших приложений, которое избавит вас от головной боли с несогласованностью данных в базе данных, и оно работает со всеми частями Django, такими как панель управления, которая вставляет пустые строки (а не значение NULL ), когда вы оставляете пустое поле при добавлении или редактировании записи.
Однако, имеются исключения, которые касаются полей типа даты, времени и чисел в вашей базе данных — они не принимают пустые строки в качестве корректных значений. Если вы попробуете добавить пустую строку в колонку с датой или цифрами — вы скорее всего получите ошибку базы данных, в зависимости от типа сервера баз данных (PostgreSQL вернёт ошибку, MySQL — может вернуть — а может и нет, в зависимости от используемой версии, времени для и фазы луны). В таком случае — NULL единственный вариант что бы задать пустое значение. В моделях Django вы можете указать, что использование NULL разрешено, добавив строку null=True к нужному полю.
Или для PostgreSQL:
Мы рассмотрим изменения схемы баз данных подробнее далее в нашей книге.
Возвращаясь к панели управления Django — теперь в форме редактирования «Add book» поле даты публикации можно оставлять пустым.
Необязательное поле django формы
После того, как вы познакомились с интерфейсом администратора, вы наверное заметили ограничение — форма редактирования требует, что бы каждое поле было заполнено, тогда как вы хотели, чтобы некоторые поля были необязательными. Например, мы желаем, чтобы поле email модели Author было необязательным, то есть оно могло принимать пустую строку. В реальности, возможно, вам не потребуется хранить адреса электронной почты всех авторов.
Это указывает Django, что поле адреса электронной почты может быть пустым. По умолчанию, все поля имеют blank=False — это означает, что поля не могут быть пустыми.
Необязательные числовые поля и поля с датой
Особо надо отметить использование blank=True совместно с полями даты/времени и численными. Погрузимся в теорию.
Что бы избежать подобной путаницы, Django автоматически создает операторы CREATE TABLE (которые рассматривались в главе « Модели » ), добавляя явно NOT NULL к каждому полю. Например, сгенерированый запрос создания таблицы для модели Author :
В большинстве случаев, такое стандартное поведение является оптимальным для вашего приложения и избавит вас от проблем, вызванных несоответствием данных. И оно отлично работает с остальными компонентами Django: такими как административный интерфейс, который вставляет пустую строку (а не значение NULL ), если вы оставляете символьное поле пустым.
(Обратите внимание, что такой синтаксис специфичен для PostgreSQL.)
Завершив изменения, вернёмся к интерфейсу администратора. Теперь форма редактирования книги позволяет оставлять пустой дату публикации.
1 комментарий | Оставьте комментарий
В MySQL код для изменения значения свойства поля с NOT NULL на NULL выглядит так:
ALTER TABLE books_book MODIFY books_book.publication_date date NULL;
Содержимое
Добавь себя на карту!
Нашли опечатку?
Документация Django 1.8
При создании класса Form наиболее важной деталью является определение полей формы. Каждое поле обладает собственной логикой проверки вводимых данных наряду с дополнительными возможностями.
Базовые аргументы поля¶
Каждый конструктор класса Field принимает эти аргументы. Некоторые классы Field принимают дополнительные аргументы. Перечисленные ниже аргументы принимаются всеми полями:
required ¶
По умолчанию каждый класс Field предполагает значение обязательным. Таким образом, если вы передадите ему пустое значение, т.е. None или пустую строку ( «» ), то метод clean() вызовет исключение ValidationError :
Для того, чтобы сделать поле “необязательным” передайте required=False в конструктор Field :
label ¶
Аргумент label позволяет вам определить “видимую людьми” метку для этого поля. Оно используется когда Field отображается на форме.
Ниже приведён пример формы, которая определяет метки для двух своих полей. Мы используем auto_id=False для упрощения вывода:
label_suffix ¶
initial ¶
Аргумент initial позволяет определять начальное значение для поля, при его отображении на незаполненной форме.
Использование этого аргумента подходит для отображения пустой формы, в которой поля будут иметь указанные значения. Например:
Вам могло прийти в голову просто передать словарь с начальными значениями при отображении формы. Но если так сделать, то вы запустите механизм проверки данных и HTML код формы будет содержать в себе результаты этой проверки:
Это главная причина, по которой начальные значения отображаются только на незаполненных формах. Для заполненных форм, HTML код всегда будет содержать введённые в форму данные.
Также следует отметить, что начальные значения не используются в качестве значений по умолчанию во время проведения проверки данных в полях формы. Начальные значения, определённые в initial предназначены лишь для первого отображения формы:
Вместо констант вы также можете передавать любой исполняемый объект ( callable ):
Исполняемый объект будет вычислен только в момент отображения незаполненной формы.
widget ¶
help_text ¶
Ниже представлен пример формы, в которой help_text определён у двух полей. Мы используем auto_id=False для упрощения вывода:
error_messages ¶
Аргумент error_messages позволяет изменить стандартные сообщения об ошибках, которые выдаёт поле. Создайте словарь с ключами тех сообщений, которые вы желаете изменить. Например, стандартное сообщение об ошибке:
А вот собственное сообщение об ошибке:
В разделе классы встроенных полей показано, что каждое поле определяет ключи сообщений об ошибках, которые оно использует.
validators ¶
Аргумент validators позволяет указать список функций, осуществляющих проверку поля.
Обратитесь к документации на валидаторы для подробной информации.
localize ¶
Аргумент localize включает локализацию для данных формы, как на входе, так и на выходе.
Обратитесь к документации на формат локализации для подробной информации.
Устанавливается при изменении данных поля¶
has_changed() ¶
Классы встроенных полей¶
Для каждого поля мы указываем виджет, который используется в случае, если вы явно не определили нужный вам виджет. Мы также указываем значение, которое будет возвращено, если вы предоставили пустое значение (см. required).
BooleanField ¶
Возвращает: True или False языка Python.
CharField ¶
Пустое значение: » (пустая строка).
Возвращает: Объект Unicode.
Имеет два необязательных аргумента для проверки:
Если они указаны, то производится соответствующая проверка длины полученной строки.
ChoiceField ¶
Пустое значение: » (пустая строка).
Возвращает: Объект Unicode.
Проверяет, что введённое значение присутствует в списке вариантов.
Принимает один дополнительный обязательный аргумент:
Итерируемый объект (т.е. список или кортеж), содержащий ряд двухэлементных кортежей, для использования в качестве вариантов для данного поля, или вызываемый объект, который возвращает такой итерируемый объект. Этот аргумент принимает те же форматы, что и аргумент choices поля модели. Обратитесь к справочнику по полям модели для подробной информации. Если в качестве аргумента используется вызываемый объект, он вычисляется при каждой инициализации поля формы.
TypedChoiceField ¶
Проверяет, что полученное значение присутствует в списке вариантов и может быть преобразовано в нужный тип.
Принимает дополнительные аргументы:
DateField ¶
Возвращает: Объект datetime.date языка Python.
Принимает один необязательный аргумент:
Если аргумент input_formats не предоставлен, то используются следующие форматы:
Обратитесь к документации на формат локализации для подробной информации.
DateTimeField ¶
Возвращает: Объект datetime.datetime языка Python.
Принимает один необязательный аргумент:
Если аргумент input_formats не предоставлен, то используются следующие форматы:
Обратитесь к документации на формат локализации для подробной информации.
DecimalField ¶
Возвращает: Тип decimal языка Python.
Проверяет, что полученное значение является десятичным. Пробелы до и после значения игнорируются.
Принимает четыре необязательных аргумента:
Максимальное число разрядов (до и после десятичной точки, впередистоящие нули обрезаются) разрешённых в значении.
Максимальное число разрешённых десятичных разрядов.
DurationField ¶
EmailField ¶
Пустое значение: » (пустая строка).
Возвращает: Объект Unicode.
Проверяет, что полученное значение является правильным адресом электронной почты, используя достаточно сложное регулярное выражение.
FileField ¶
Может проверять, что данные непустого файла были связаны с формой.
Для получения подробностей об объекте « UploadedFile`, см. документацию по загрузке файлов.
При использовании FileField на форме, вы должны не забыть связать данные файла с формой.
Ошибка max_length относится к длине имени файла. В сообщении об ошибке шаблон %(max)d будет заменён максимальной длиной имени файла, а %(length)d – длиной имени текущего файла.
FilePathField ¶
Возвращает: Объект Unicode.
Проверяет, что выбранное значение присутствует в списке вариантов.
Поле позволяет выбирать файл из определённого каталога. Оно принимает три дополнительных аргумента, требуя обязательного наличия аргумента path :
Абсолютный путь до каталога, содержимое которого вы желаете отобразить. Этот каталог должен существовать.
Шаблон регулярного выражения. Отображаться будут только те файлы, которые подходят под указанное регулярное выражение.
FloatField ¶
Возвращает: Тип float языка Python.
Проверяет, что полученное значение является числом с плавающей точкой. Пробелы до и после значения не влияют на преобразование значения, так как эта ситуация обрабатывается функцией float() языка Python.
ImageField ¶
Проверяет, что данные файла были связаны с формой, а затем, что файл является изображением, формат которого поддерживается библиотекой Pillow.
Использование ImageField требует наличия Pillow (рекомендуется) с поддержкой используемых вами форматов изображений. Если вы сталкиваетесь с ошибкой corrupt image при загрузке изображения, обычно это означает, что Pillow не поддерживает такой формат изображения. Для решения этой проблемы, установите соответствующую библиотеку и переустановите Pillow.
При использовании ImageField на форме, вы должны не забыть связать данные файла с формой.
IntegerField ¶
Возвращает: Тип integer или long языка Python.
Проверяет, что полученное значение является целым числом. Пробелы до и после значения не влияют на преобразование значения, так как эта ситуация обрабатывается функцией int() языка Python.
Принимает два необязательных аргумента для проверки:
Они определяют диапазон значений, разрешённый для поля.
IPAddressField ¶
Пустое значение: » (пустая строка).
Возвращает: Объект Unicode.
Проверяет с помощью регулярного выражения, что полученное значение является правильным IPv4 адресом.
GenericIPAddressField ¶
Поле для обработки адресов IPv4 или IPv6.
Пустое значение: » (пустая строка).
Возвращает: Объект Unicode. Преобразование IPv6 адресов описано далее.
Проверяет, что полученное значение является правильным IP адресом.
Принимает два необязательных аргумента:
MultipleChoiceField ¶
Пустое значение: [] (пустой список).
Возвращает: Список объектов Unicode.
Проверяет, что каждое значение из полученного списка присутствует в списке вариантов.
TypedMultipleChoiceField ¶
Проверяет, что полученные значения присутствуют в списке вариантов и могут быть преобразованы в нужный тип.
NullBooleanField ¶
RegexField ¶
Пустое значение: » (пустая строка).
Возвращает: Объект Unicode.
Проверяет, что полученное значение совпадает с указанным регулярным выражением.
Принимает один обязательный аргумент:
Регулярное выражение в виде строки или скомпилированного объекта регулярного выражения.
SlugField ¶
Пустое значение: » (пустая строка).
Возвращает: Объект Unicode.
Проверяет, что полученное значение содержит только буквы, цифры, подчёркивания и тире.
TimeField ¶
Возвращает: Объект datetime.time языка Python.
Проверяет, что переданное значение является объектом datetime.time или строкой, отформатированной в нужном виде.
Принимает один необязательный аргумент:
Если аргумент input_formats не предоставлен, то используются следующие форматы:
URLField ¶
Пустое значение: » (пустая строка).
Возвращает: Объект Unicode.
Проверяет, что полученное значение является правильным URL.
Принимает следующие необязательные аргументы:
UUIDField ¶
Пустое значение: » (пустая строка).
Достаточно сложные встроенные классы Field ¶
ComboField ¶
Пустое значение: » (пустая строка).
Возвращает: Объект Unicode.
Принимает один дополнительный обязательный аргумент:
Список полей, которые должны использоваться для проверки значения поля (в порядке их определения).
MultiValueField ¶
Пустое значение: » (пустая строка).
Агрегирует логику нескольких полей, создавая единое значение.
Принимает один дополнительный обязательный аргумент:
Принимает один необязательный аргумент:
Этот метод должен быть реализован в дочерних классах.
SplitDateTimeField ¶
Стандартный виджет: :class: SplitDateTimeWidget
Возвращает: Объект datetime.datetime языка Python.
Проверяет, что переданное значение является объектом datetime.datetime или строкой, отформатированной в нужном виде.
Принимает два необязательных аргумента:
Поля для обработки связей¶
Возможно указать queryset=None при определении поля, далее в конструкторе формы определить значение этого атрибута:
ModelChoiceField ¶
Возвращает: Экземпляр модели.
Проверяет, что полученный идентификатор присутствует в выборке.
Позволяет выбор единственного объекта модели, имеет смысл при отображении внешнего ключа. Следует отметить, что стандартный виджет для ModelChoiceField становится непрактичным когда число его значений растёт. Сотня значений уже становится проблемой.
Единственный обязательный аргумент:
Объект QuerySet содержит выборку объектов модели, которые являются значениями для этого поля и которые будут использоваться для проверки полученных данных.
ModelChoiceField принимает два необязательных аргумента:
Поля формы ¶
Когда вы создаете Form класс, наиболее важной частью является определение полей формы. Каждое поле имеет настраиваемую логику проверки, а также несколько других ловушек.
Field. clean ( значение ) ¶
Аргументы основного поля ¶
Каждый Field конструктор класса принимает по крайней мере эти аргументы. Некоторые Field классы принимают дополнительные аргументы, зависящие от поля, но всегда следует принимать следующее:
required ¶
Чтобы указать, что поле не является обязательным, перейдите required=False к Field конструктору:
label ¶
Как объяснено выше в разделе «Вывод форм как HTML», метка по умолчанию для a Field создается из имени поля путем преобразования всех подчеркиваний в пробелы и верхнего регистра первой буквы. Укажите, label если это поведение по умолчанию не приводит к адекватной метке.
Вот полный пример, Form который реализуется label для двух его полей. Мы указали, auto_id=False чтобы упростить вывод:
label_suffix ¶
initial ¶
Чтобы указать динамические начальные данные, см. Form.initial Параметр.
Вы можете подумать, а почему бы просто не передать словарь начальных значений в виде данных при отображении формы? Что ж, если вы это сделаете, вы активируете проверку, и вывод HTML будет включать любые ошибки проверки:
Вот почему initial значения отображаются только для несвязанных форм. Для связанных форм в выводе HTML будут использоваться связанные данные.
Также обратите внимание, что initial значения не используются в качестве «резервных» данных при проверке, если не указано значение конкретного поля. initial значения предназначены только для отображения начальной формы:
Вместо константы вы также можете передать любой вызываемый объект:
Вызываемый объект будет оцениваться только при отображении несвязанной формы, а не при ее определении.
widget ¶
help_text ¶
Вот полный пример, Form который реализуется help_text для двух его полей. Мы указали, auto_id=False чтобы упростить вывод:
error_messages ¶
А вот собственное сообщение об ошибке:
В разделе встроенных классов полей ниже каждый Field определяет ключи сообщений об ошибках, которые он использует.
validators ¶
validators Аргумент позволяет предоставить список функций проверки для этого поля.
localize ¶
localize Аргумент позволяет локализацию ввода данных формы, а также обработанную продукцию.
disabled ¶
Проверка, изменились ли данные поля ¶
has_changed() ¶
См. Form.has_changed() Документацию для получения дополнительной информации.
Встроенные Field классы ¶
Естественно, forms библиотека поставляется с набором Field классов, которые представляют общие потребности в валидации. В этом разделе описано каждое встроенное поле.
BooleanField ¶
CharField ¶
Имеет четыре необязательных аргумента для проверки:
Если предоставлены, эти аргументы гарантируют, что строка будет не больше или не меньше заданной длины.
Если True (по умолчанию), значение будет очищено от начальных и конечных пробелов.
Значение, которое следует использовать для представления «пусто». По умолчанию пустая строка.
ChoiceField ¶
Принимает один дополнительный аргумент:
TypedChoiceField ¶
Принимает дополнительные аргументы:
Значение, которое следует использовать для представления «пусто». По умолчанию пустая строка; None еще один распространенный выбор здесь. Обратите внимание, что это значение не будет принудительно изменяться функцией, указанной в coerce аргументе, поэтому выберите его соответствующим образом.
DateField ¶
Принимает один необязательный аргумент:
Список форматов, используемых для попытки преобразовать строку в допустимый datetime.date объект.
DateTimeField ¶
Принимает один необязательный аргумент:
Список форматов, используемых для попытки преобразовать строку в допустимый datetime.datetime объект, в дополнение к форматам ISO 8601.
Добавлена поддержка синтаксического анализа строки даты ISO 8601 (включая необязательный часовой пояс).
DecimalField ¶
Принимает четыре необязательных аргумента:
Они управляют диапазоном значений, разрешенных в поле, и должны быть указаны как decimal.Decimal значения.
Максимальное количество цифр (до десятичной точки плюс цифры после десятичной точки с удаленными ведущими нулями), разрешенное в значении.
Максимально разрешенное количество десятичных знаков.
DurationField ¶
EmailField ¶
FileField ¶
max_length Ошибка относится к длине имени файла. В сообщении об ошибке для этого ключа, %(max)d будет заменена максимальная длина имени файла и %(length)d будет заменена текущая длина имени файла.
FilePathField ¶
Поле позволяет выбирать файлы внутри определенного каталога. Требуется пять дополнительных аргументов; path требуется только :
Абсолютный путь к каталогу, содержимое которого вы хотите перечислить. Этот каталог должен существовать.
Шаблон регулярного выражения; только файлы с именами, соответствующими этому выражению, будут допущены в качестве выбора.
FloatField ¶
ImageField ¶
Для использования ImageField требуется, чтобы Pillow был установлен с поддержкой используемых вами форматов изображений. Если вы столкнулись с ошибкой при загрузке изображения, это обычно означает, что Pillow не понимает его формат. Чтобы исправить это, установите соответствующую библиотеку и переустановите Pillow. corrupt image
IntegerField ¶
Принимает два необязательных аргумента для проверки:
Они управляют диапазоном значений, разрешенных в поле.
JSONField ¶
Принимает два необязательных аргумента:
json.JSONDecoder Подкласс десериализация входа. При десериализации может потребоваться учет того факта, что вы не можете быть уверены в типе ввода. Например, вы рискуете вернуть a, datetime который на самом деле был строкой, которая случайно оказалась в том же формате, который был выбран для datetime s.
decoder Может быть использовано для подтверждения ввода. Если json.JSONDecodeError возникает во время десериализации, ValidationError будет повышен.
JSONField в большинстве случаев не очень удобен для пользователя. Однако это полезный способ форматирования данных из клиентского виджета для отправки на сервер.
GenericIPAddressField ¶
Поле, содержащее адрес IPv4 или IPv6.
Принимает два необязательных аргумента:
MultipleChoiceField ¶
TypedMultipleChoiceField ¶
NullBooleanField ¶
NullBooleanField может использоваться с виджетами, такими как Select или RadioSelect путем предоставления виджета choices :
RegexField ¶
Принимает один обязательный аргумент:
Регулярное выражение, заданное в виде строки или скомпилированного объекта регулярного выражения.
SlugField ¶
Это поле предназначено для использования при представлении модели SlugField в формах.
Принимает два необязательных параметра:
Значение, которое следует использовать для представления «пусто». По умолчанию пустая строка.
TimeField ¶
Принимает один необязательный аргумент:
Список форматов, используемых для попытки преобразовать строку в допустимый datetime.time объект.
URLField ¶
UUIDField ¶
Это поле будет принимать любой строковый формат, принятый в качестве hex аргумента UUID конструктора.
Слегка сложные встроенные Field классы ¶
ComboField ¶
Принимает один дополнительный обязательный аргумент:
Список полей, которые следует использовать для проверки значения поля (в том порядке, в котором они указаны).
MultiValueField ¶
Агрегирует логику нескольких полей, которые вместе создают одно значение.
Принимает один дополнительный обязательный аргумент:
Также принимает некоторые необязательные аргументы:
incomplete Сообщение об ошибке по умолчанию может быть определено в MultiValueField подклассе, или различные сообщения могут быть определены для каждого отдельного поля. Например:
Этот метод должен быть реализован в подклассах.
SplitDateTimeField ¶
Принимает два необязательных аргумента:
Список форматов, используемых для попытки преобразовать строку в допустимый datetime.date объект.
Список форматов, используемых для попытки преобразовать строку в допустимый datetime.time объект.
Поля, которые обрабатывают отношения ¶
Для более сложных применений вы можете указать queryset=None при объявлении поля формы, а затем заполнить queryset в __init__() методе формы :
Оба ModelChoiceField и ModelMultipleChoiceField имеют iterator атрибут, который указывает класс, используемый для итерации по набору запросов при генерации вариантов выбора. См. Подробности в разделе « Итерация выбора отношений».
ModelChoiceField ¶
Позволяет выбрать один объект модели, подходящий для представления внешнего ключа. Обратите внимание, что виджет по умолчанию для ModelChoiceField становится непрактичным, когда количество записей увеличивается. Вам не следует использовать его для более чем 100 предметов.
Требуется единственный аргумент:
Набор QuerySet объектов модели, на основе которых производятся варианты выбора для поля и который используется для проверки выбора пользователя. Он оценивается при рендеринге формы.
ModelChoiceField также принимает два необязательных аргумента:
По умолчанию виджет, используемый пользователем, ModelChoiceField будет иметь пустой выбор вверху списка. Вы можете изменить текст этой метки (которая используется «———» по умолчанию) с помощью empty_label атрибута, или вы можете полностью отключить пустую метку, установив empty_label значение None :
Обратите внимание, что если a ModelChoiceField является обязательным и имеет начальное значение по умолчанию, пустой выбор не создается (независимо от значения empty_label ).