some more options / features for I18nField
This commit is contained in:
parent
fa450084dc
commit
6cfd8eb0e3
3 changed files with 19 additions and 9 deletions
|
@ -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):
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue