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))