2010-07-02 2 views
2

Я строю класс формы в python для создания и проверки HTML-форм. Каждое поле имеет связанный виджет, который определяет способ визуализации поля.Какой тип данных должен принимать или возвращать мои виджеты?

Когда виджет создан, он передается по значению (по умолчанию), чтобы он знал, что отображать при первом визуализации. После отправки формы виджет запрашивает значение. Я делегирую это виджету, а не просто набирая его из данных POST, потому что виджет может состоять из нескольких входов HTML (подумайте о селекторе месяца/дня/года). Только виджет знает, как объединить их в одно значение.

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

Философия, лежащая в основе моего класса формы, - «смешивать и сочетать». Вы выбираете, какой виджет вы хотите, и какие валидаторы/форматирующие/конвертеры, которые вы хотите запустить на нем. Который, как мне кажется, подходит для «использования строк», и пусть разработчик принимает решение о типах данных типа, но ... Я не могу придумать ничего хорошего. Вы ожидаете каких-либо проблем с этим подходом?

ответ

2

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

Подумайте о примере с датой, вместо того чтобы проходить вокруг объекта date, вместо этого вы проходите мимо str формата "2010-01-01". Чтобы работать с этими данными, каждый пользователь класса должен знать не только то, что это str, который представляет date, но какой формат этой строки. Другими словами, вы ничего не получили. Хуже того, вы теряете возможность передать объект datetime в виджет (если только вы не предпримете дополнительные шаги для решения этого случая).

Вопрос валидатора или форматирования не так велик, как вы думаете. как часто вы собираетесь проверять строку, которая не представляет дату, как если бы это была дата?

+0

Итак, вы предлагаете, чтобы все виджеты даты принимали объекты datetime? И, полагаю, тогда они должны также возвращать объекты datetime? Таким образом, валидатор ... на самом деле не нужен, потому что значение уже в правильном формате? Вы правы, что не хотите представлять дату-дату в качестве даты, но как насчет того, хочет ли разработчик использовать простой виджет ввода текста для дат? Затем виджет должен вернуть строку, потому что она не знает, что вводится, а затем она * должна * быть правильно проверена. Конечно, разработчик мог бы опустить валидатор в бывшем ... – mpen

+0

... случае, но добавьте его во второй случай. Но теперь мы создаем несоответствия, которые могут усложнить ситуацию?Что делать, если разработчик начинает с простого текстового виджета для дат, и поэтому аргумент по умолчанию должен быть строкой, а затем решает переключить его с помощью виджета фактической даты, но забывает обновлять аргумент по умолчанию в объект datetime? Я вижу обе стороны ... вот почему это сложное решение :( – mpen

+1

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

1

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

Некоторые потенциальные проблемы или аспекты для рассмотрения:

  • Локализация: как интерпретировать строку в отношении культуры, какой формат является канонический формат для сравнения.
  • Производительность: некоторые преобразования могут занять много времени, но я предполагаю, что для человеческого взаимодействия это будет достаточно быстро.
Смежные вопросы