Source code for tags_input.fields
from django import forms
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from . import widgets
from . import utils
[docs]class TagsInputField(forms.ModelMultipleChoiceField):
widget = widgets.TagsInputWidget
default_error_messages = {
'list': _('Enter a list of values.'),
'invalid_choice': _('Select a valid choice. %s is not one of the'
' available choices.'),
'invalid_pk_value': _('"%s" is not a valid value for a primary key.')
}
def __init__(self, queryset, **kwargs):
self.create_missing = kwargs.pop('create_missing', False)
self.mapping = kwargs.pop('mapping', None)
super(TagsInputField, self).__init__(queryset, **kwargs)
self.widget.mapping = self.get_mapping()
[docs] def get_mapping(self):
if not self.mapping:
self.mapping = mapping = utils.get_mapping(self.queryset)
mapping['queryset'] = self.queryset
mapping['create_missing'] = (
self.create_missing or mapping.get('create_missing', False)
)
return self.mapping
[docs] def clean(self, value):
mapping = self.get_mapping()
fields = mapping['fields']
filter_func = mapping['filter_func']
join_func = mapping['join_func']
split_func = mapping['split_func']
values = dict(
join_func(v)[::-1] for v in self.queryset
.filter(**filter_func(value))
.values('pk', *fields)
)
values = dict((k.lower(), v) for k, v in values.items())
missing = [v for v in value if v.lower() not in values]
if missing:
if mapping['create_missing']:
for v in value:
if v in missing:
o = self.queryset.model(**split_func(v))
o.clean()
o.save()
values[v.lower()] = o.pk
else:
raise ValidationError(
self.error_messages['invalid_choice'],
code='invalid_choice',
params={'value': ', '.join(missing)},
)
ids = []
for v in value:
ids.append(values[v.lower()])
return forms.ModelMultipleChoiceField.clean(self, ids)
[docs]class AdminTagsInputField(TagsInputField):
widget = widgets.AdminTagsInputWidget
def __init__(self, queryset, verbose_name=None, *args, **kwargs):
TagsInputField.__init__(self, queryset, *args, **kwargs)
if verbose_name: # pragma: no branch
self.label = verbose_name