def __init__(self, pattern, display_names=None, *args, **kwargs): if 'coerce' in kwargs: raise TypeError("`coerce` should not be set directly") kwargs['coerce'] = force_text self._pattern = pattern self._display_names = display_names # twiddle over the choices. if 'choices' in kwargs: templates = kwargs.pop('choices') if callable(templates): templates = templates() else: templates = find_all_templates(pattern=pattern) choices = list(template_choices(templates=templates, display_names=self._display_names)) kwargs.update(choices=choices) super(TemplateChoiceField, self).__init__(*args, **kwargs) if not self.required or len(choices) == 0: self.choices = BLANK_CHOICE_DASH + choices
def wrapper(instance): def yielder(selected, choices, attname): for value, key in choices: yield { 'description': key, 'path': value, 'selected': selected == value, '_meta': { 'attribute': attname, 'extension': os.path.splitext(value)[1] or None, 'basename': os.path.basename(value), 'dirname': os.path.dirname(value) or None, 'segments': value.split(os.path.sep), } } attname = self.get_attname() choices = template_choices( templates=self.fnmatcher.get_matches(), display_names=self._display_names) value = getattr(instance, attname) return tuple(yielder(selected=value, choices=choices, attname=attname))