代码之家  ›  专栏  ›  技术社区  ›  John Mee

如何使用Django的MultiWidget?

  •  44
  • John Mee  · 技术社区  · 14 年前

    关于这个特性的文档有点缺乏。

    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]
    

    我可以看到我需要创建一个带有其他小部件列表的“小部件”属性,但是在那之后它会得到一个小的Sherlock Holmes。

    有人能给我解释一下如何使用MultiWidget吗?

    2 回复  |  直到 14 年前
        1
  •  52
  •   Community CDub    7 年前

    有趣的问题,我想也许应该在文档中多关注一点。

    下面是一个来自 a question I've just asked :

    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 控件中的小部件 元组。这一点很重要,因为超类使用这个元组的存在来为您处理一些事情。
    • 我的格式输出是pass-through,但是我的想法是,如果您愿意,可以在这里添加自定义html
    • 我还实施了 decompress value 对象。 将其分解以在小部件中显示。如何和你在这里做什么取决于你和小部件。

    我没有,但可以,压倒一切的事情:

    • render

    例如,django markitup 的渲染方法:

    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 -看到我的问题了吗 here
    • _get_media 如果您想使用django的媒体表示来检索媒体,可能会很有用。默认实现循环请求媒体的小部件;如果你对它进行子类化,并且正在使用任何花哨的小部件,你需要调用super;如果你的小部件需要任何媒体,那么你需要用这个来添加它。

    例如, 马基图普 的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 the source .

    推荐文章