Есть простая модель для набора цветов проекта:
PROJECT_COLOR_BASE = 1
PROJECT_COLOR_ACCENT = 2
PROJECT_COLOR_CHOICES = (
(PROJECT_COLOR_BASE, _(u'Base Color')),
(PROJECT_COLOR_ACCENT, _(u'Accent Color'))
)
class ProjectColor(models.Model):
u"""Модель для хранения цветов проекта: базовые и акцентные."""
project = models.ForeignKey(Project, verbose_name=_(u'Project'))
kind = models.IntegerField(default=PROJECT_COLOR_BASE, choices=PROJECT_COLOR_CHOICES,
verbose_name=_(u'Type of a color'))
value = models.CharField(max_length=6, default='ffffff', verbose_name=_(u'Value, in HEX'))
objects = ProjectColorManager()
class Meta:
verbose_name = _(u'Project Color')
verbose_name_plural = _(u'Project Colors')
И такой же простой менеджер к ней:
class ProjectColorManager(models.Manager):
def base(self):
from . models import PROJECT_COLOR_BASE
return self.filter(kind=PROJECT_COLOR_BASE)
def accent(self):
from . models import PROJECT_COLOR_ACCENT
return self.filter(kind=PROJECT_COLOR_ACCENT)
Модель ProjectColor
подключена в модель Project
через инлайн админки:
HEX_RE = re.compile(r'^[0-9a-f]+$', re.IGNORECASE)
class ProjectColorForm(forms.ModelForm):
class Meta:
model = models.ProjectColor
def clean_value(self):
value = self.cleaned_data['value']
if len(value) not in (3, 6):
raise forms.ValidationError(_(u'Enter 3 or 6 symbols here.'))
if HEX_RE.search(value) is None:
raise forms.ValidationError(_(u'Enter HEX value please.'))
return value
class ProjectColorInline(admin.TabularInline):
model = models.ProjectColor
extra = 0
max_num = 10
fields = ('kind', 'value')
form = forms.ProjectColorForm
Всё работает без проблем, сохраняются любые HEX комбинации. Но, если выбрать "базовый цвет" и ввести "ffffff", то в метод save_formset
приходит пустая форма для этой комбинации. Если глянуть в консоль хрома, то видно как на сервер отправляются все данные. В общем, происходит "непонятная херня" (с)
Есть идеи?