def __init__(self, *, choices=None, max_choices=None, min_choices=None, label=None, max_length=10000, doc='', initial=None, blank=False, **kwargs): kwargs.update( dict( choices=choices, label=label, initial=initial, max_choices=max_choices, min_choices=min_choices, )) self.inner_choices = kwargs.pop('choices', None) if self.inner_choices is not None: self.max_choices = kwargs.pop('max_choices', len(self.inner_choices)) self.min_choices = kwargs.pop('min_choices', 0) else: self.max_choices = kwargs.pop('max_choices', None) self.min_choices = kwargs.pop('min_choices', None) if self.max_choices: self.inner_choices = [ str(i) for i in range(1, self.max_choices + 1) ] else: if self.min_choices: self.inner_choices = [ str(i) for i in range(1, self.min_choices + 1) ] else: self.inner_choices = [ str(i) for i in range(1, self.default_length) ] self.initial = initial kwargs.setdefault('help_text', '') kwargs.setdefault('null', True) label = kwargs['label'] kwargs.setdefault('verbose_name', label) kwargs.setdefault('default', kwargs.pop('initial', None)) self.initial = kwargs['default'] if isinstance(self.inner_choices, (list, tuple)): self.inner_choices = list(expand_choice_tuples(self.inner_choices)) kwargs.setdefault('verbose_name', kwargs.pop('label')) super().__init__(choices=None, max_length=max_length, blank=None, **kwargs)
def fix_choices_arg(self, kwargs): '''allows the programmer to define choices as a list of values rather than (value, display_value) ''' choices = kwargs.get('choices') if not choices: return choices = expand_choice_tuples(choices) kwargs['choices'] = choices
def __init__(self, other_value=None, other_label=None, label='', **kwargs): self.choices = kwargs.pop('choices') if other_label: self.other_label = other_label if other_value: self.other_value = other_value # check that other_value provided is valid assert self.other_value.isidentifier(), wrong_value_msg self.choices = list(expand_choice_tuples(self.choices)) flat_choices = [i for i, j in self.choices] # check if value of choices start with other_val and divider, like 'other: SOMETHING' for i in flat_choices: assert not i.startswith(self.other_value), duplicate_err_msg self.choices += [(self.other_value, self.other_label), ] self.widget = OtherSelectorWidget(choices=self.choices, other_val=self.other_value) fields = (CharField(required=True), CharField(required=False),) super().__init__(fields=fields, require_all_fields=False, label=label, **kwargs)
def __setattr__(self, name, value): super().__setattr__(name, value) if name == 'choices': if isinstance(value, (list, tuple)) and len(value) > 0: self.inner_choices = list(expand_choice_tuples(value))
def get_FIELD_display(self): choices = getattr(self, field.name + '_choices')() value = getattr(self, field.attname) return dict(expand_choice_tuples(choices))[value]