栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用Django的MultiWidget?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用Django的MultiWidget?

有趣的问题,我认为也许在文档中值得更多关注。

这是我刚问过的一个问题的例子:

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
    因为你必须-你应该期望在单个value对象中从数据库传递值。
    decompress
    将其分解以显示在小部件中。你在这里的操作方式和操作取决于你,取决于小部件。
    我没有但可能已经覆盖的东西:

  • render
    ,这实际上是负责渲染小部件的,因此,如果将其子类化,则肯定需要调用super render方法。你可以通过将其子类化来更改在呈现之前事物的显示方式。
    例如,
    django markitup
    render
    方法:

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
    将与此小部件关联的值从所有以此形式提交的数据的数据字典中拉出。如果多控件代表一个字段,则需要从多个子控件中重建该值,这就是提交数据的方式。
  • _get_media
    如果你想使用django的媒体表示来检索媒体,则对你可能有用。默认实现会循环窗口小部件询问媒体。如果你将其子类化并且正在使用任何精美的小部件,则需要调用super;如果你的窗口小部件需要任何媒体,则需要使用此媒体进行添加。
    例如,
    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班上重要部分。你要尝试执行的操作确实取决于你创建的内容/所使用的小部件,这就是为什么我无法轻松进行详细介绍的原因。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/380219.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号