Как использовать MultiWidget Django?

документация немного отсутствует в отношении этой функции.

from django import forms

class TwoInputWidget(forms.MultiWidget):
    """An example widget which concatenates two text inputs with a space"""
    def __init__(self, attrs=None):
        widgets = [forms.TextInput, forms.TextInput]

Я вижу, что мне нужно создать свойство "виджеты" со списком других виджетов, но после этого он получает немного Шерлока Холмса.

кто-нибудь, пожалуйста, объясните мне, как использовать виджет MultiWidget?

2 ответов


интересный вопрос, и я думаю, возможно, заслуживает немного больше внимания в документах.

вот пример вопрос, который я только что задал:

class DateSelectorWidget(widgets.MultiWidget):
    def __init__(self, attrs=None, dt=None, mode=0):  
        if dt is not None:
            self.datepos = dt
        else:
            self.datepos = date.today()    

        # bits of python to create days, months, years
        # example below, the rest snipped for neatness.

        years = [(year, year) for year in year_digits]

        _widgets = (
            widgets.Select(attrs=attrs, choices=days), 
            widgets.Select(attrs=attrs, choices=months),
            widgets.Select(attrs=attrs, choices=years),
            )
        super(DateSelectorWidget, self).__init__(_widgets, attrs)

    def decompress(self, value):
        if value:
            return [value.day, value.month, value.year]
        return [None, None, None]

    def format_output(self, rendered_widgets):
        return u''.join(rendered_widgets)

что я сделала?

  • наследование django.forms.widgets.MultiWidget
  • реализован конструктор, который создает несколько widgets.WidgetName виджеты в кортеж. Это важно, потому что супер класс использует существование этого кортежа, чтобы заботиться о нескольких вещах для вы.
  • мой формат вывода является сквозным, но идея в том, что вы можете добавить пользовательский html здесь, Если хотите
  • я также реализовал decompress потому что вы должны-вы должны ожидать, что будут переданы значения из базы данных в одном 'ы оказываем:
    def render(self, name, value, attrs=None):
        html = super(MarkItUpWidget, self).render(name, value, attrs)
    
        if self.auto_preview:
            auto_preview = "$('a[title=\"Preview\"]').trigger('mouseup');"
        else: auto_preview = ''
    
        html += ('<script type="text/javascript">'
                '(function($) { '
                 '$(document).ready(function() {'
                 '  $("#%(id)s").markItUp(mySettings);'
                 '  %(auto_preview)s '
                 '});'
                 '})(jQuery);'
                 '</script>' % {'id': attrs['id'],
                                'auto_preview': auto_preview })
        return mark_safe(html)
    
    • value_from_datadict - вижу, мой вопрос здесь. value_from_datadict вытягивает значение, связанное с этот виджет из словаря данных всех представленных данных с этой формой. В случае multiwidget, представляющего одно поле, вам нужно восстановить это значение из нескольких подвиджетов, так как данные будут отправлены.
    • _get_media может быть полезно для вас, если вы хотите получить медиа, используя представление Django медиа. Реализация по умолчанию циклы виджетов, запрашивающих медиа; если вы подкласс его и используете какие-либо причудливые виджеты вы нужно позвонить супер; если ваш виджет нуждается в каких-либо медиа, то вам нужно добавить его с помощью этого.

    например, markitupвиджет django делает это:

    def _media(self):
            return forms.Media(
                css= {'screen': (posixpath.join(self.miu_skin, 'style.css'),
                                 posixpath.join(self.miu_set, 'style.css'))},
                js=(settings.JQUERY_URL,
                    absolute_url('markitup/jquery.markitup.js'),
                    posixpath.join(self.miu_set, 'set.js')))
        media = property(_media)
    

    опять же, он создает кортеж путей к правильному местоположению, так же, как мой виджет создал кортеж виджетов в __init__ метод.

    Я думаю, что охватывает его для важных частей MultiWidget класса. То, что ты пытаешься сделать, зависит от того, что у тебя есть. создал / какие виджеты вы используете, поэтому я не могу легко вдаваться в детали. Однако, если вы хотите увидеть базовый класс для себя и взглянуть на комментарии, взгляните на источник.


прочитайте это запись в блог и связанный Django фрагмент. Надеюсь, это даст вам некоторые идеи.