mirror of
https://github.com/SectorLabs/django-localized-fields.git
synced 2025-12-14 07:42:24 +03:00
Advanced django admin integration
This commit is contained in:
@@ -2,53 +2,18 @@ from typing import List
|
||||
|
||||
from django import forms
|
||||
from django.conf import settings
|
||||
from django.forms import MultiWidget
|
||||
|
||||
from .localized_value import LocalizedValue
|
||||
from .widgets import LocalizedFieldWidget
|
||||
|
||||
|
||||
class LocalizedFieldWidget(MultiWidget):
|
||||
"""Widget that has an input box for every language."""
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
"""Initializes a new instance of :see:LocalizedFieldWidget."""
|
||||
|
||||
widgets = []
|
||||
|
||||
for _ in settings.LANGUAGES:
|
||||
widgets.append(forms.Textarea())
|
||||
|
||||
super(LocalizedFieldWidget, self).__init__(widgets, *args, **kwargs)
|
||||
|
||||
def decompress(self, value: LocalizedValue) -> List[str]:
|
||||
"""Decompresses the specified value so
|
||||
it can be spread over the internal widgets.
|
||||
|
||||
Arguments:
|
||||
value:
|
||||
The :see:LocalizedValue to display in this
|
||||
widget.
|
||||
|
||||
Returns:
|
||||
All values to display in the inner widgets.
|
||||
"""
|
||||
|
||||
result = []
|
||||
|
||||
for lang_code, _ in settings.LANGUAGES:
|
||||
if value:
|
||||
result.append(value.get(lang_code))
|
||||
else:
|
||||
result.append(None)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
class LocalizedFieldForm(forms.MultiValueField):
|
||||
"""Form for a localized field, allows editing
|
||||
the field in multiple languages."""
|
||||
|
||||
widget = LocalizedFieldWidget()
|
||||
widget = LocalizedFieldWidget
|
||||
value_class = LocalizedValue
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
"""Initializes a new instance of :see:LocalizedFieldForm."""
|
||||
@@ -59,17 +24,21 @@ class LocalizedFieldForm(forms.MultiValueField):
|
||||
field_options = {'required': False}
|
||||
|
||||
if lang_code == settings.LANGUAGE_CODE:
|
||||
field_options['required'] = True
|
||||
field_options['required'] = kwargs.get('required', True)
|
||||
|
||||
field_options['label'] = lang_code
|
||||
fields.append(forms.fields.CharField(**field_options))
|
||||
|
||||
super(LocalizedFieldForm, self).__init__(
|
||||
fields,
|
||||
require_all_fields=False
|
||||
require_all_fields=False,
|
||||
*args, **kwargs
|
||||
)
|
||||
# set 'required' attribute for each widget separately
|
||||
for f, w in zip(self.fields, self.widget.widgets):
|
||||
w.is_required = f.required
|
||||
|
||||
def compress(self, value: List[str]) -> LocalizedValue:
|
||||
def compress(self, value: List[str]) -> value_class:
|
||||
"""Compresses the values from individual fields
|
||||
into a single :see:LocalizedValue instance.
|
||||
|
||||
@@ -82,7 +51,7 @@ class LocalizedFieldForm(forms.MultiValueField):
|
||||
the value in several languages.
|
||||
"""
|
||||
|
||||
localized_value = LocalizedValue()
|
||||
localized_value = self.value_class()
|
||||
|
||||
for (lang_code, _), value in zip(settings.LANGUAGES, value):
|
||||
localized_value.set(lang_code, value)
|
||||
|
||||
Reference in New Issue
Block a user