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'])
|
||||
new_fields[sub_field_name] = CharField(label=field_title,
|
||||
required=False,
|
||||
initial=values[language].strip(), max_length=50)
|
||||
initial=values[language].strip(),
|
||||
max_length=model_field.i18n_max_length)
|
||||
|
||||
if has_values:
|
||||
self.i18n_fields.append((model_field, values))
|
||||
|
@ -152,6 +153,12 @@ class EditorFormBase(ModelForm):
|
|||
if not self.cleaned_data.get('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()
|
||||
|
||||
def full_clean(self):
|
||||
|
|
|
@ -156,7 +156,7 @@ class I18nDescriptor:
|
|||
|
||||
fallback_value = self.field.fallback_value
|
||||
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),
|
||||
fallback_language=self.field.fallback_language,
|
||||
fallback_any=self.field.fallback_any,
|
||||
|
@ -164,21 +164,24 @@ class I18nDescriptor:
|
|||
|
||||
|
||||
class I18nField(JSONField):
|
||||
def __init__(self, plural_name=None, fallback_language=settings.LANGUAGE_CODE,
|
||||
fallback_any=False, fallback_value=None, default=None):
|
||||
def __init__(self, verbose_name=None, plural_name=None, max_length=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.fallback_language = fallback_language
|
||||
self.fallback_any = fallback_any
|
||||
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):
|
||||
name, path, args, kwargs = super().deconstruct()
|
||||
kwargs = {}
|
||||
if self.default != {}:
|
||||
kwargs['default'] = self.default
|
||||
if self.default == {}:
|
||||
kwargs.pop('default')
|
||||
if self.plural_name is not None:
|
||||
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:
|
||||
kwargs['fallback_language'] = self.fallback_language
|
||||
if self.fallback_any:
|
||||
|
|
|
@ -47,7 +47,7 @@ class 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:
|
||||
abstract = True
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue