Различия между версиями 22 и 23
Версия 22 от 2010-07-12 07:15:39
Размер: 41103
Редактор: RostislavDzinko
Комментарий:
Версия 23 от 2010-07-12 07:45:53
Размер: 43376
Редактор: RostislavDzinko
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 400: Строка 400:
 * '''!TextWidget''': Being probably the simplest widget, it displays the text input element and is mainly used for the TextLine, which expects to be unicode. It also serves as base widget for many of the following widgets.
 * '''!TextAreaWidget''': As the name suggests this widget displays a text area and assumes its input to be some unicode string. (note that the Publisher already takes care of the encoding issues).
 * '''!BytesWidget, !BytesAreaWidget''': Direct descendents from TextWidget and TextAreaWidget, the only difference is that these widgets expect bytes as input and not a unicode string, which means they must be valid ASCII encodable.
 * '''ASCIIWidget''': This widget, based on the BytesWidget, ensures that only ASCII character are part of the inputted data.
 * '''!PasswordWidget''': Almost identical to the TextWidget, it only displays a password element instead of a text element.
 * '''!IntWidget''': A derivative of TextWidget, it only overwrites the conversion method to ensure the conversion to an integer.
 * '''!FloatWidget''': Derivative of TextWidget, it only overwrites the conversion method to ensure the conversion to an floating point.
 * '''!DatetimeWidget''': Someone might expect a smart and complex widget at this point, but for now it is just a simple TextWidget with a string to datetime converter. There is also a DateWidget that only handles dates.
 * '''!TextWidget''': будучи самым простым виджетом, он отображает строку ввода, и, в основном, используется для поля !TextLine, которое ожидает ввода юникод строки. Он также служит базовым виджетом для многих последующих.
 * '''!TextAreaWidget''': как и предполагает имя, виджет отображает поле для ввода текста, и ожидает некую юникод строку. (заметьте, что Publisher сам заботится о кодировании/декодировании).
 * '''!BytesWidget, !BytesAreaWidget''': прямые потомки !TextWidget и !TextAreaWidget, разница только в том, что эти виджеты принимают на ввод байтовую, а не юникод строку, что значит, она должна быть ASCII кодируемая.
 * '''ASCIIWidget''': этот виджет базируется на !BytesWidget, и уверяет, что вводными данными являются только ASCII символы.
 * '''!PasswordWidget''': Почти идентичные !TextWidget, только отображает вместо строки ввода текста строку ввода пароля.
 * '''!IntWidget''': наследуется от !TextWidget, переопределяет метод конвертации, чтобы убедится, что вводимые данные - целое число.
 * '''!FloatWidget''': наследуется от !TextWidget, переопределяет метод конвертации, чтобы удостоверится, что вводимые данные - число с плавающей точкой.
 * '''!DatetimeWidget''': кто-то может ожидать сложный виджет здесь, но пока - это просто !TextWidget, в котором происходит конвертация строки в тип datetime. Также существует !DateWidget, который обрабатывает только даты.

=== Логические виджеты ===

Ответственность логических виджетов заключается в том, чтобы сконвертировать некий двоичный ввод в значения True или False.

 * '''!CheckBoxWidget''': этот виджет отображает одну галочку (checkbox), которая может иметь состояния "отмечено" или "не отмечено", отображая состояния логического значения.
 * '''!BooleanRadioWidget''': две кнопки опции, которые используются для отображения состояния истина/ложь логической переменной. Для двух состояний в конструктор нужно передавать текстовые значения. По умолчанию - “on” и “off” (или их перевод для конкретного языка).
 * '''!BooleanSelectWidget, BooleanDropdownWidget''': Подобно !BooleanRadioWidget, текстовые отображения состояний, которые используются для установки значения. Посмотрите !SelectWidget и !DropdownWidget, соответственно, для получения более полной информации.

Руководство по BlueBream (часть 2)

Интерфейсы (Interface)

Введение

Интерфейсы - это объекты, которые определяют (документируют) внешнее поведение объектов, которые их предоставляют. Интерфейс определяет поведение через:

  • Информационное документирование в строках документации (doc string)
  • Определение атрибутов
  • Инварианты, являющиеся условиями, которые должны выполнятся для объектов, которые предоставляют интерфейс.

Вот несколько мотиваций для использования интерфейсов:

  • Избежание монолитной архитектуры, разрабатывая маленькие, заменяемые части приложения;
  • Моделирование внешней ответственности, функциональности и поведения
  • Установка связей между частями функционала
  • Документирование API.

Классическая книга по программной инженерии Design Patterns, авторами которой являются Банда четырех рекомендует программировать на интерфейс, а не на реализацию. Определение формального интерфейса помогает в понимании системы. Более того, интерфейсы приносят все преимущества компонентной архитектуры Zope.

В некоторых современных языках программирования: Java, C#, VB.NET и т.д., интерфейсы - явный аспект языка. Поскольку в Python интерфейсов нет, Zope реализует их через механизм мета-классов, от которых необходимо наследоваться.

Я могу сделать X

  • Описание способности что-нибудь сделать - классическое определение API. Эти способности определены и реализованы как методы.

У меня есть X

  • Это высказывание объявляет о доступности данных, которые классически ассоциируются со схемами. Данные хранятся в атрибутах и свойствах.

Вы можете сделать X используя меня

  • Тут мы описываем поведение объекта. Классического аналога нет, но MIME-типы - замечательный пример объявления поведения. Это реализуется с помощью интерфейсов-маркеров (marker interfaces), так как они неявно описывают поведение. Разницу между этими тремя типами взаимодействия впервые указал Philipp von Weitershausen.

Понимание различий этих трех подходов очень важна, так как другие языки программирования не обязательно их реализуют. Обычно используется только первый.

Определение интерфейсов

  • Python не реализует концепцию интерфейсов
  • Это не проблема
  • Интерфейсы - всего лишь объекты
  • “Злоупотребляют” ключевым словом class для создания интерфейса

  • Синтаксис был предложен в PEP 245

В Java, например, интерфейсы - специальные типы объектов, которые могут служить в качестве интерфейсов в их ограниченной области видимости.

С другой стороны интерфейс из пакета zope.interface определяет интерфейс путем реализации мета-класса, одной из основополагающих концепций языка Python. Тем не менее, интерфейс просто используют существующий шаблон Python.

Пример

Вот классический пример в стиле hello world:

   1 >>> class Host(object):
   2 ...
   3 ...     def goodmorning(self, name):
   4 ...         """Say good morning to guests"""
   5 ...
   6 ...         return "Good morning, %s!" % name

В этом классе вы определили метод goodmorning. Если вы вызываете этот метод из экземпляра этого класса, он вернет Good morning, ...!.

   1 >>> host = Host()
   2 >>> host.goodmorning('Jack')
   3 'Good morning, Jack!'

Здесь host - экземпляр класса (объект), который использует код приведенный выше. Если вам нужны детали реализации, вам следует обратится к классу Host, либо через исходный код, либо через API документации.

Теперь будем использовать интерфейсы. Для данного класса определим интерфейс следующим образом:

   1 >>> from zope.interface import Interface
   2 
   3 >>> class IHost(Interface):
   4 ...
   5 ...     def goodmorning(guest):
   6 ...         """Say good morning to guest"""

Как видите, интерфейс является потомком класса zope.interface.Interface. Префикс I - очень полезная конвенция для именования интерфейсов.

Объявление интерфейсов

В предыдущей главе Вы уже увидели как объявлять интерфейс с использованием пакета zope.interface. Эта глава объясняет технологию интерфейсов более подробно.

Возьмем в качестве примера следующее:

   1 >>> from zope.interface import Interface
   2 >>> from zope.interface import Attribute
   3 
   4 >>> class IHost(Interface):
   5 ...     """A host object"""
   6 ...
   7 ...     name = Attribute("""Name of host""")
   8 ...
   9 ...     def goodmorning(guest):
  10 ...         """Say good morning to guest"""

Интерфейс IHost обладает двумя атрибутами: name и goodmorning. Вспомните что, по крайней мере в Python, методы также являются атрибутами классов. Атрибут name определен с использованием класса zope.interface.Attribute. Когда вы добавляете атрибуту name к интерфейсу IHost, то не устанавливаете начальное значение. Здесь цель определения этого атрибута - просто показать, что любая реализация этого интерфейса будет содержать атрибут name. В этом случае, мы даже не указали тип атрибута! Вы можете передать строку документации в качестве первого параметра конструктору Attribute.

ругой атрибут, goodmorning - это метод, который определен с использованием синтаксиса функций. Заметьте, что self в этом случае не обязателен, потому что детали реализации - это уже класс. Например, модуль может реализовать интерфейс. Если модуль реализует этот интерфейс, он будет обладать атрибутом name и содержать определенную функцию goodmorning. Функция goodmorning будет принимать один аргумент.

Сейчас мы осветим связку интерфейс-класс-объект. Объект - это "реальная живая" вещь, и объекты являются экземплярами классом. Интерфейс - действительное формальное описание объекта, соответственно классы - просто реализация интерфейса. Вот почему следует программировать интерфейсы, а не реализации.

Теперь вам следует ознакомится еще с двумя понятиями объединяющими эти концепции. Первое - предоставлять (provide), а второе - реализовать (implement). Объекты предоставляют интерфейсы, а классы реализуют интерфейсы. Другими словами, объекты предоставляют интерфейсы, которые реализуют их классы. В предыдущем примере host (объект) предоставляет IHost (интерфейс), а Host (класс) реализует IHost (интерфейс). Один объект может предоставлять более одного интерфейса; также один класс может реализовать более одного интерфейса. Объекты также могут предоставлять интерфейсы прямо, вдобавок к тому, что реализуют их классы.

Классы - реализация объектов. В Python, классы - вызываемые объекты, так почему бы другим вызываемым объектам не реализовать интерфейс? Да, это возможно. Вы можете указать любому вызываемому объекту, что он создает объекты, предоставляющие некие интерфейсы, говоря что этот вызываемый объект реализует интерфейсы. Вызываемые объекты в общем случае называются фабриками (factories). Так как функции - вызываемые объекты, они могут реализовать интерфейсы.

Реализация интерфейсов

Для того, чтобы объявить о том, что класс реализует некий интерфейс, используйте функцию zope.interface.implements в коде определения класса.

Представьте себе пример, в котором Host реализует IHost:

   1 >>> from zope.interface import implements
   2 
   3 >>> class Host(object):
   4 ...
   5 ...     implements(IHost)
   6 ...
   7 ...     name = u''
   8 ...
   9 ...     def goodmorning(self, guest):
  10 ...         """Say good morning to guest"""
  11 ...
  12 ...         return "Good morning, %s!" % guest

Если вам интересно, как работает функция implements, обратитесь к блогу James Henstridge (http://blogs.gnome.org/jamesh/2005/09/08/python-class-advisors/). В разделе адаптеры, вы найдете функцию adapts, которая работает таким же образом.

Так как Host реализует IHost, экземпляры класса Host предоставляют IHost. Существуют также вспомогательные методы для просмотра деклараций. Декларация также может быть описана вне класса. Если вы не сделали interface.implements(IHost), как показано в примере выше, то после определения класса, вы можете сделать следующее:

   1 >>> from zope.interface import classImplements
   2 >>> classImplements(Host, IHost)

Интерфейсы-маркеры

Интерфейсы могут использоваться для того, чтобы объявить о том, что объект принадлежит к некоему специальному типу. Интерфейс без каких-либо атрибутов и методов называют маркером.

Вот пример интерфейса-маркера:

   1 >>> from zope.interface import Interface
   2 
   3 >>> class ISpecialGuest(Interface):
   4 ...     """A special guest"""

Этот интерфейс может использоваться для того, чтобы объявить о том, что объект является специальным гостем.

Контент компоненты (Content component)

Введение

Взгляните на следующий пример:

   1 >>> from zope import interface
   2 
   3 >>> class IPerson(interface.Interface):
   4 ...     name = interface.Attribute("Name")
   5 >>> class Person(object):
   6 ...     interface.implements(IPerson)
   7 ...     name = None
   8 >>> jack = Person()
   9 >>> jack.name = "Jack"

В этом примере jack - это контент-компонент. Следовательно, контент-компонент - не что иное, как объект, который предоставляет определенный интерфейс. Как было сказано в предыдущей главе, можно использовать zope.schema для определения полей интерфейса. В предыдущем интерфейсе, их можно определить примерно так:

   1 >>> from zope import interface
   2 >>> from zope import schema
   3 
   4 >>> class IPerson(interface.Interface):
   5 ...     name = schema.TextLine(
   6 ...         title=u"Name",
   7 ...         description=u"Name of person",
   8 ...         default=u"",
   9 ...         required=True)

Если вы разрабатываете корпоративное приложение, содержимое (контент) - это одна из наиболее важных вещей, которую следует организовать в первую очередь. Для того, чтобы обучить вас писать приложения с контент-компонентами, эта глава содержит пример простого приложения сборщика заявок.

Сначала рассмотрим желание клиента, которое будет реализовано в следующих главах.

  1. Один контейнер заявок для каждого проекта. Много контейнеров могут быть добавлены в проект.
  2. В контейнер может быть добавлено любое количество заявок.
  3. Каждая заявка будет добавлена с описанием и одним начальным комментарием.
  4. Следующие комментарии могут быть добавлены к заявкам.
  5. Эта глава начинает простую реализацию сборщика заявок.

Как говорилось выше, наша цель - разработать полностью рабочий, хотя необязательно красиво выглядящий, веб ориентированный сборщик заявок. Корневым объектов будет Collector, который может содержать объекты заявок (Ticket) от различных пользователей. Так как вы хотите разрешить пользователям отвечать на заявки, вам следует предоставить заявкам возможность хранить в себе ответы, которые и есть объектами Comment.

Это значить, что у вас есть два компонента контейнера: Collector содержит только заявки, и может быть добавлен в любую папку Folder или другой контейнер, который способен содержать его. Для того, чтобы сделать сборщик заявок поинтереснее, он также должен иметь описание, которое вкратце представляет предмет/тему дискуссии. Заявки, с другой стороны могут хранится только в объекте Collector. Каждая из них будет иметь краткое и развернутое описание. И напоследок, Comment должен хранится только в заявках.

Такая настройка должна содержать все необходимые вещи, которые сделают проект полезным. Позже вы добавите еще много мета данных к этим компонентам для реализации более плотной интеграции с BlueBream и добавления дополнительного функционала.

Наиболее удобное место для расположения пакета - $HOME/myzope/lib/python. Для создания пакета, добавьте папку:

   1 $ cd $HOME/myzope/lib/python/
   2 $ mkdir collector

(на GNU/Linux).

Для того, чтобы сделать эту папку пакетом, добавьте туда пустой файл init.py. В GNU/Linux вы можете сделать примерно следующее:

   1 $ echo "# Make it a Python package" >> collector/__init__.py

но вы также можете использовать текстовый редактор и сохранить файл под этим именем. Просто удостоверьтесь, что в этом файле содержится правильный Python код. Файл должен содержать по крайней мере пробелы, так как пустые файлы плохо обрабатываются архиваторами.

Теперь вы будете работать только внутри пакета collector, который размещен в $HOME/myzope/lib/python/collector.

Схемы и виджеты

Введение

На ранних этапах разработки, разработчики BlueBream (раньше Zope 3) решили, что писать HTML формы вручную и вручную проверять правильность введенных данных довольно громоздко. Команда BlueBream поняла, что если расширить интерфейсы, можно будет автоматически генерировать формы и выполнять проверку введенных данных. Эта глава предоставляет информацию и формально представляет пакеты zope.schema и zope.formlib.

Schema - это интерфейс, который определен с помощью специальных атрибутов, называемых "полями".

Схема разрабатывалась для достижения трех основных целей:

  • Полное описание свойств на уровне API
  • Проверка и конверсия пользовательского ввода
  • Автоматизированная генерация GUI форм (в основном для Web обозевателя)

Схема против интерфейса

Как упоминалось выше, схемы - это просто расширения интерфейсов и поэтому они зависят от пакета zope.interface. Поля схем равноценны методам в интерфейсах. Они совместимы друг с другом, так как описывают разные аспекты объекта. Методы интерфейса описывают функциональность компонента, тогда как поля схемы представляют состояние.

Поэтому разработка нового синтаксиса для написания схем необязательно, схемы просто используют декларацию интерфейса.

   1 from zope.interface import Interface
   2 from zope.schema import Text
   3 
   4 class IExample(Interface):
   5 
   6    text = Text(
   7        title=u"Text",
   8        description=u"The text of the example.",
   9        required=True)
  • Строка 2: все стандартные поля импортируются из zope.schema.

  • Строки 7-8: заголовок и описание используют человеческий язык (это нужно для генерации форм). Они также служат в качестве документации к полю.
  • Строка 9: разные поля поддерживают несколько полей мета данных. Настройка required доступна для всех полей и определяет, является ли поле обязательным, или нет (то есть может ли значение поля быть пустым).

Основные поля схемы

После того, как мы увидели простой пример схемы, давайте рассмотрим все основные поля и их свойства.

Свойства, которые поддерживают все поля

  • title (тип: TextLine): заголовок атрибута, используется как метка при отображении виджета поля.

  • description (тип: Text): описание атрибута, используется во всплывающих подсказках и расширенной помощи.

  • required (тип: Bool): определяет, является ли атрибут обязательным (то есть, может ли быть его значение пустым). В формах добавления, обязательные атрибуты равнозначны обязательным аргументам конструктора.

  • readonly (тип: Bool): если поле readonly, то значение атрибута устанавливается один раз, и после этого не изменяется, то есть доступно только для отображения. Часто уникальный идентификатор для некоего объекта используется как поле только для чтения.

  • default (тип: зависит от поля): значение по умолчанию, которое дается атрибуту, если не была проведена инициализация. Это значение часто определяется для обязательных полей.

  • order (тип: Int): поля часто группируются в некоем логическом порядке. Это значение определяет относительную позицию в этом порядке. Обычно это значение не устанавливается вручную, так как оно автоматически присваивается при инициализации интерфейса. Порядок полей в схеме по умолчанию такой же, как и в коде Python.

Bytes, BytesLine

Bytes и BytesLine отличаются только тем, что BytesLine не может содержать символ новой строки. Bytes ведут себя так же, как и строка в Python.

Поля Bytes и BytesLine доступны для выполнения итераций.

  • min_length (тип: Int): минимальное количество символов в строке. По умолчанию - None, что значит, что ограничения нет.

  • max_length (тип: Int): максимальное количество символов в строке. По умолчанию - None, что значит, что ограничения по максимуму нет.

Text, TextLine

Два этих поля отличаются только тем, что TextLine не может содержать символ новой строки. Текстовые поля содержат юникод, а это значит, что они предназначены для хранения текстов, которые будут читать пользователи приложение.

Поля Text и TextLine доступны для выполнения итераций.

  • min_length (тип: Int): минимальное количество символов в строке. По умолчанию - None, что значит, что ограничения нет.

  • max_length (тип: Int): максимальное количество символов в строке. По умолчанию - None, что значит, что ограничения по максимуму нет.

SourceText

SourceText - специальное поле, наследуемое от Text, которое содержит исходный код любого типа. Это поле более менее похоже на маркер для того, чтобы указать механизму создания форм, что нужны специальные поля ввода для исходников.

Password

Password - специальный дочерний класс поля TextLine, создан только в целях отделения механизмов отображения. Также для паролей обычно используется специальная проверка вводимых данных.

Bool

Поле Bool не имеет атрибутов. Оно отображает значение прямо в тип данных bool языка Pytho.

Int

Поля Int прямо отображаются в целочисленный тип языка Python.

  • min (тип: Int): описывает минимально допустимое значение. Это удобно во многих случаях, например разрешая только положительные значения, предоставляя этому параметру значение 0.

  • max (тип: Int): описывает наибольшее допустимое целочисленное значение поля, исключая себя. Оно может быть использовано для установки верхней границы, например, года, если вы заинтересованы только в прошлом.

Оба атрибута могут использоватся вместе, чтобы позволить разработчику устанавливать принимаемые значения.

Float

Поле Float прямо отображается в тип данных float языка Python.

  • min (тип: Int): описывает минимально допустимое значение. Это удобно во многих случаях, например разрешая только положительные значения, предоставляя этому параметру значение 0.

  • max (тип: Int): описывает наибольшее допустимое целочисленное значение поля, исключая себя. Оно может быть использовано для установки верхней границы, например, года, если вы заинтересованы только в прошлом.

Оба атрибута могут использоватся вместе, чтобы позволить разработчику устанавливать принимаемые значения.

Datetime

Похожее на Int и Float, Datetime, имеет поля min и max, определяет границы возможных значений. Принимаемые значения этих полей должны быть экземплярами встроенного типа данных datetime.

Tuple, List

Причина, по которой эти поля существуют такова, что они просто отображаются в родные типы данных Python - tuple и list, соответственно.

Поля Tuple и List доступны для итераций.

  • min_length (тип: Int): в последовательности не может быть меньше элементов, чем это значние. По умолчанию - None, который значит что минимального количества нет.

  • max_length (тип: Int): не может быть большего количество элементов в последовательности. По умолчанию - None, который значит, что максимума не существует.

  • value_type (тип: Field): значения, которые содержатся в этой последовательности, должны соответствовать ограничению поля. Наиболее общий случай - поле Choice (смотрите ниже), которое позволяет выбрать из смешанного набора значений.

Dict

Dict - поле, что отображает множество значений на другое множество значений.

Это поле доступна для выполнения итераций.

  • min_length (тип: Int): в последовательности не может быть меньше элементов, чем это значние. По умолчанию - None, который значит что минимального количества нет.

  • max_length (тип: Int): не может быть большего количество элементов в последовательности. По умолчанию - None, который значит, что максимума не существует.

  • key_type (тип: Field): каждый ключ словаря должен соответствовать указанному полю.

  • value_type (тип: Field): значения, которые содержатся в этой последовательности, должны соответствовать ограничению поля. Наиболее общий случай - поле Choice (смотрите ниже), которое позволяет выбрать из смешанного набора значений.

Choice

Поле Choice позволяет выбрать конкретное значение из предостваленного списка. Вы можете предоставлять значения как простую последовательность (список или кортеж), либо указать словарь (vocabulary) (по ссылке или имени), который предоставляет эти значения. Словари предоставляют гибкий список значений, другими словами - множество допустимых значений меняется с изменениями в системе. Так как они более сложные, они описаны отдельно в "Словари и Поля".

  • vocabulary (тип: Vocabulary): экземпляр словаря, который предоставляет доступные значения. Этот атрибут - None, если имя словаря указано, а поле не привязано к контексту.

  • vocabularyName (тип: TextLine): имя словаря, который предоставляет значения. Словарь по этому имени ищется, когда поле привязано, другими словами, - имеет контекст. Насчет привязки: словарь по умолчанию ищется по имени и контексту.

Конструктор также принимает аргумент values, который определяет статическое множество значений. Эти значения сразу же конвертируются в статический словарь (vocabulary).

Object

Это поле определяет объект, который должен реализовать конкретную схему. Допускаются только объекты, которые реализуют схему.

  • schema (тип: Interface): это поле предоставляет ссылку на схему, которую должны предоставлять объекты, которые хранятся в описываемом атрибуте.

DottedName

Наследовано от поля BytesLine, поле DottedName представляет правильные имена в стиле Python (ссылки на объекты). Это поле может быть использовано, когда нужно предоставить правильное имя в стиле Python.

Поле не имеет дополнительных атрибутов.

URI

Наследовано от поля BytesLine, поле URI уверяет, что значение - всегда правильный URI. Это особенно полезно, когда нужно хранить ссылки на ресурсы (такие как RSS ленты или изображения) на удаленных компьютерах.

Это поле не имеет дополнительных атрибутов.

Id

Вместе поля DottedName и !URI, создают поле Id. Любое имя или URI представляют правильный идентификатор в Zope. Идентификаторы используются для определения многих типов объектов, таких как права доступа и пользователи, но также используются для предоставления ключей аннотаций.

Это поле не имеет дополнительных атрибутов.

InterfaceField

Поле Interface не имеет дополнительных атрибутов. Это значение - это объект, который предоставляет zope.interface.Interface, другими словами - это должен быть интерфейс.

Для получения полного списка API схем/полей посмотрите инструмент документации по API по ссылке http://localhost:8080/++apidoc++ или модуль zope.schema.interfaces.

Автоматическая генерация форм с помощью пакета forms

Формы - более Zope-специфические, чем схемы, и находятся в пакете zope.formlib. Виды для полей схемы называются виджетами. Виджеты отвечают за отображение данных и их конвертацию в специальный тип данных для представления. На данный момент существуют виджеты в основном для HTML (веб обозревателя).

Виджеты разделены на две группы: отображения и ввода. Виджеты отображения зачастую очень простые и показывают только текстовое представление Python объекта. Виджеты ввода более сложные и имеют более широкий выбор. Следующий список показывает все доступные в обозревателе виджеты ввода (находятся в zope.formlib.widget):

Текстовые виджеты

Текстовые виджеты всегда требуют ввода с клавиатуры. Строковое представление поля потом конвертируется в нужный Python объект, например integer или date.

  • TextWidget: будучи самым простым виджетом, он отображает строку ввода, и, в основном, используется для поля TextLine, которое ожидает ввода юникод строки. Он также служит базовым виджетом для многих последующих.

  • TextAreaWidget: как и предполагает имя, виджет отображает поле для ввода текста, и ожидает некую юникод строку. (заметьте, что Publisher сам заботится о кодировании/декодировании).

  • BytesWidget, BytesAreaWidget: прямые потомки TextWidget и TextAreaWidget, разница только в том, что эти виджеты принимают на ввод байтовую, а не юникод строку, что значит, она должна быть ASCII кодируемая.

  • ASCIIWidget: этот виджет базируется на BytesWidget, и уверяет, что вводными данными являются только ASCII символы.

  • PasswordWidget: Почти идентичные TextWidget, только отображает вместо строки ввода текста строку ввода пароля.

  • IntWidget: наследуется от TextWidget, переопределяет метод конвертации, чтобы убедится, что вводимые данные - целое число.

  • FloatWidget: наследуется от TextWidget, переопределяет метод конвертации, чтобы удостоверится, что вводимые данные - число с плавающей точкой.

  • DatetimeWidget: кто-то может ожидать сложный виджет здесь, но пока - это просто TextWidget, в котором происходит конвертация строки в тип datetime. Также существует DateWidget, который обрабатывает только даты.

Логические виджеты

Ответственность логических виджетов заключается в том, чтобы сконвертировать некий двоичный ввод в значения True или False.

  • CheckBoxWidget: этот виджет отображает одну галочку (checkbox), которая может иметь состояния "отмечено" или "не отмечено", отображая состояния логического значения.

  • BooleanRadioWidget: две кнопки опции, которые используются для отображения состояния истина/ложь логической переменной. Для двух состояний в конструктор нужно передавать текстовые значения. По умолчанию - “on” и “off” (или их перевод для конкретного языка).

  • BooleanSelectWidget, BooleanDropdownWidget: Подобно BooleanRadioWidget, текстовые отображения состояний, которые используются для установки значения. Посмотрите SelectWidget и DropdownWidget, соответственно, для получения более полной информации.

Перевод: Ростислав Дзинько

Документации/Bluebream/Руководство2 (последним исправлял пользователь RostislavDzinko 2010-07-12 22:56:48)