You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

70 lines
3.6 KiB

# -*- 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'})