# -*- coding: utf-8 -*- from django import forms import autocomplete_light def set_field_error(form, field, msg=u'Обязательное поле.'): """Добавить сообщение об ошибке поля и убрать это поле из списка успешно прошедших валидацию. Полезно, если нужно инвалидировать поле из метода clean() и добавить ему ошибку. В этом случае исключение forms.ValidationError() не подходит, т.к. оно добавит сообщение об ошибке в ошибки формы. """ form._errors[field] = form.error_class([msg]) if field in form.cleaned_data: del form.cleaned_data[field] class _MySuperForm(object): """Базовая форма. Добавляет всякого полезного функционала к форме.""" # Список условно-обязательных полей, у которых нужно установить атрибут required=False. # Полезно, когда какие-то поля становятся обязательны к заполнению в зависимости от значения других полей. conditional_fields = [] #TODO мигрировать на unset_required # Список полей, у которых нужно сбросить признак обязательности: required=False. # Полезно, когда в базовой форме определяются какие-то поля, которые в одних унаследованных формах обязательны, # а в других нет. unset_required = [] # Словарь полей, у которых нужно заменить атрибут label. # Полезно, когда нужно дать разные метки полям в админке и в форме, с которой работает пользователь. change_labels = {} def __init__(self, *args, **kwargs): fields = self.fields # включить локализацию для DecimalFields for field in fields.values(): if isinstance(field, forms.DecimalField): field.localize = True field.widget.is_localized = True # сбросить признак обязательности у условно-обязательных полей for key in self.conditional_fields: fields[key].required = False # сбросить признак обязательности for key in self.unset_required: fields[key].required = False # заменить label for key, label in self.change_labels.items(): fields[key].label = label class MyBaseForm(forms.Form, _MySuperForm): """Расширение django.forms.Form.""" def __init__(self, *args, **kwargs): forms.Form.__init__(self, *args, **kwargs) _MySuperForm.__init__(self, *args, **kwargs) class MyBaseModelForm(forms.ModelForm, _MySuperForm): """Расширение django.forms.ModelForm.""" def __init__(self, *args, **kwargs): forms.ModelForm.__init__(self, *args, **kwargs) _MySuperForm.__init__(self, *args, **kwargs) f = self.fields if 'units' in f: f['units'].widget = autocomplete_light.TextWidget('ACMeasure') if 'total_price' in f: f['total_price'].widget = forms.TextInput(attrs={'disabled': 'disabled'})