воскресенье, 25 сентября 2011 г.

Добавляем * к обязательным полям в django forms через label_tag (Adding * to required fields in label_tag)

Раньше не парился и расставлял звездочки прямо в шаблоне. Задача была сформулирована так: необходимо чтобы за пометку (*) обязательного поля (в django forms) отвечал метод label_tag, т.к. в формах мы используем его чтобы вывести лейбл. Т.е. больше не хотим расставлять условияв шаблоне или звездочки напрямую.
Я погуглил и нашел кучу ненужного говна. А решение подсказал чувак по имени Farhan Ahmad, решил он эту задачу судя по всему еще в 2009 году.Для тех у кого туго с английским, кратко поясню что нужно сделать. Кстати Farhan решил еще и приделывать к лейблу класс 'required'.

Итак, для начала определяются две функции:
  1. from django.utils.html import escape
  2.  
  3. def add_required_label_tag(original_function):
  4.   """Adds the 'required' CSS class and an asterisks to required field labels."""
  5.   def required_label_tag(self, contents=None, attrs=None):
  6.     contents = contents or escape(self.label)
  7.     if self.field.required:
  8.       if not self.label.endswith(" *"):
  9.         self.label += " *"
  10.         contents += " *"
  11.       attrs = {'class''required'}
  12.     return original_function(self, contents, attrs)
  13.   return required_label_tag
  14.  
  15. def decorate_bound_field():
  16.   from django.forms.forms import BoundField
  17.   BoundField.label_tag = add_required_label_tag(BoundField.label_tag
Первая — декоратор, а вторая просто вспомогательная, которая применит декоратор ко всем формам. Автор предлагает поместить этот код в project.forms.__init__.py, я так и поступил.
А затем в модуле с формами просто вызываем следующий код:
  1. from project.forms import decorate_bound_field
  2. decorate_bound_field()
Вот собственно и все. Решение мне очень понравилось, thank you Farhan Ahmad! Сам автор благодарит так же и Adil Saleem.

UPDATE:
Решение было мной доработано, всвязи с проблемами в админке django
UPDATE 2:
С выходом django 1.6 нарисовалась еще одна проблемка

Комментариев нет:

Отправить комментарий