some more options / features for I18nField

This commit is contained in:
Laura Klünder 2017-11-30 15:26:06 +01:00
parent fa450084dc
commit 6cfd8eb0e3
3 changed files with 19 additions and 9 deletions

View file

@ -50,7 +50,8 @@ class EditorFormBase(ModelForm):
lang=language_info['name_translated']) lang=language_info['name_translated'])
new_fields[sub_field_name] = CharField(label=field_title, new_fields[sub_field_name] = CharField(label=field_title,
required=False, required=False,
initial=values[language].strip(), max_length=50) initial=values[language].strip(),
max_length=model_field.i18n_max_length)
if has_values: if has_values:
self.i18n_fields.append((model_field, values)) self.i18n_fields.append((model_field, values))
@ -152,6 +153,12 @@ class EditorFormBase(ModelForm):
if not self.cleaned_data.get('geometry'): if not self.cleaned_data.get('geometry'):
raise ValidationError('Missing geometry.') raise ValidationError('Missing geometry.')
for field, values in self.i18n_fields:
if not field.blank and not any(values.values()):
raise ValidationError(_('You have to choose a value for {field} in at least one language.').format(
field=field.verbose_name
))
super().clean() super().clean()
def full_clean(self): def full_clean(self):

View file

@ -156,7 +156,7 @@ class I18nDescriptor:
fallback_value = self.field.fallback_value fallback_value = self.field.fallback_value
if fallback_value is not None: if fallback_value is not None:
fallback_value = format_lazy(fallback_value, model_name=instance._meta.verbose_name, pk=instance.pk) fallback_value = format_lazy(fallback_value, model=instance._meta.verbose_name, pk=instance.pk)
return lazy_get_i18n_value(getattr(instance, self.field.attname), return lazy_get_i18n_value(getattr(instance, self.field.attname),
fallback_language=self.field.fallback_language, fallback_language=self.field.fallback_language,
fallback_any=self.field.fallback_any, fallback_any=self.field.fallback_any,
@ -164,21 +164,24 @@ class I18nDescriptor:
class I18nField(JSONField): class I18nField(JSONField):
def __init__(self, plural_name=None, fallback_language=settings.LANGUAGE_CODE, def __init__(self, verbose_name=None, plural_name=None, max_length=None, default=None,
fallback_any=False, fallback_value=None, default=None): fallback_language=settings.LANGUAGE_CODE, fallback_any=False, fallback_value=None, **kwargs):
self.i18n_max_length = max_length
self.plural_name = plural_name self.plural_name = plural_name
self.fallback_language = fallback_language self.fallback_language = fallback_language
self.fallback_any = fallback_any self.fallback_any = fallback_any
self.fallback_value = fallback_value self.fallback_value = fallback_value
super().__init__(default=(dict(default) if default else {}), null=False) kwargs.pop('null', None)
super().__init__(verbose_name=verbose_name, default=(dict(default) if default else {}), null=False, **kwargs)
def deconstruct(self): def deconstruct(self):
name, path, args, kwargs = super().deconstruct() name, path, args, kwargs = super().deconstruct()
kwargs = {} if self.default == {}:
if self.default != {}: kwargs.pop('default')
kwargs['default'] = self.default
if self.plural_name is not None: if self.plural_name is not None:
kwargs['plural_name'] = self.plural_name kwargs['plural_name'] = self.plural_name
if self.i18n_max_length is not None:
kwargs['max_length'] = self.i18n_max_length
if self.fallback_language != settings.LANGUAGE_CODE: if self.fallback_language != settings.LANGUAGE_CODE:
kwargs['fallback_language'] = self.fallback_language kwargs['fallback_language'] = self.fallback_language
if self.fallback_any: if self.fallback_any:

View file

@ -47,7 +47,7 @@ class SerializableMixin(models.Model):
class TitledMixin(SerializableMixin, models.Model): class TitledMixin(SerializableMixin, models.Model):
title = I18nField(plural_name='titles', fallback_any=True, fallback_value='{model_name} {pk}') title = I18nField(_('Title'), plural_name='titles', blank=True, fallback_any=True, fallback_value='{model} {pk}')
class Meta: class Meta:
abstract = True abstract = True