Django MultiValueField - Как передать выбор ChoiceField?

from operator import itemgetter

your_list.sort(key=itemgetter('date'), reverse=True)

Связанные примечания

  • не используют list, dict как имена переменной, они - встроенные имена в Python. Это делает Ваш код трудно для чтения.

  • Вы, возможно, должны были бы заменить словарь tuple или collections.namedtuple или пользовательский подобный структуре класс в зависимости от контекста

    from collections import namedtuple
    from operator    import itemgetter
    
    Row = namedtuple('Row', 'title date')
    rows = [Row(row.title, row.created_on) for row in data]
    rows.sort(key=itemgetter(1), reverse=True)
    

Пример:

>>> lst = [Row('a', 1), Row('b', 2)]
>>> lst.sort(key=itemgetter(1), reverse=True)
>>> lst
[Row(title='b', date=2), Row(title='a', date=1)]

Или

>>> from operator import attrgetter
>>> lst = [Row('a', 1), Row('b', 2)]
>>> lst.sort(key=attrgetter('date'), reverse=True)
>>> lst
[Row(title='b', date=2), Row(title='a', date=1)]

Вот то, как namedtuple взгляды внутри:

>>> Row = namedtuple('Row', 'title date', verbose=True)

class Row(tuple):
        'Row(title, date)'

        __slots__ = ()

        _fields = ('title', 'date')

        def __new__(cls, title, date):
            return tuple.__new__(cls, (title, date))

        @classmethod
        def _make(cls, iterable, new=tuple.__new__, len=len):
            'Make a new Row object from a sequence or iterable'
            result = new(cls, iterable)
            if len(result) != 2:
                raise TypeError('Expected 2 arguments, got %d' % len(result))
            return result

        def __repr__(self):
            return 'Row(title=%r, date=%r)' % self

        def _asdict(t):
            'Return a new dict which maps field names to their values'
            return {'title': t[0], 'date': t[1]}

        def _replace(self, **kwds):
            'Return a new Row object replacing specified fields with new values'

            result = self._make(map(kwds.pop, ('title', 'date'), self))
            if kwds:
                raise ValueError('Got unexpected field names: %r' % kwds.keys())

            return result

        def __getnewargs__(self):
            return tuple(self)

        title = property(itemgetter(0))
        date = property(itemgetter(1))
9
задан Terry J 24 October 2009 в 11:32
поделиться

2 ответа

Взгляните на источник __ init __ из форм.MultiValueField :

def __init__(self, fields=(), *args, **kwargs):
    super(MultiValueField, self).__init__(*args, **kwargs)
    # Set 'required' to False on the individual fields, because the
    # required validation will be handled by MultiValueField, not by those
    # individual fields.
    for f in fields:
        f.required = False
    self.fields = fields

Так что я бы перезаписал __ init __ возможно, примерно так:

def __init__(self, *args, **kwargs):
    choices = kwargs.pop("choices",[])
    super(InputAndChoiceField, self).__init__(*args, **kwargs)
    self.fields = (
        fields.CharField(),
        fields.ChoiceField(choices=choices),
    )

Возможно, вы даже захотите сделать super (MultiValueField, self) .__ init __ (* args, ** kwargs) вместо super (InputAndChoiceField, self) .__ init __ (* args, ** kwargs) , потому что вы устанавливаете поля самостоятельно, а не получаете их через параметры.

1
ответ дан 4 December 2019 в 23:40
поделиться

передача вариантов в виджете решила эту проблему для меня

class InputAndChoiceWidget(widgets.MultiWidget):
    def __init__(self, attrs=None):
        choices = [('a', 1), ('b', 2)]
        widget = (widgets.TextInput(),
                  widgets.Select(choices=choices)
                 )
        super(InputAndChoiceWidget, self).__init__(widget, attrs=attrs)
1
ответ дан 4 December 2019 в 23:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: