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.
64 lines
3.3 KiB
64 lines
3.3 KiB
# -*- coding: utf-8 -*-
|
|
from django import forms
|
|
|
|
|
|
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.iteritems():
|
|
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)
|
|
|