当前位置: 首页 > 面试题库 >

如何使用Django的MultiWidget?

郎飞航
2023-03-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]

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

有人可以向我解释如何使用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 markituprender方法:

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;如果你的窗口小部件需要任何媒体,则需要使用此媒体进行添加。
    例如,markitupdjango小部件可以执行以下操作:
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(1.2)的流响应的“ hello world”。我弄清楚了如何使用生成器和函数。但是响应仍然没有流式传输。我怀疑其中有一个中间件-也许是ETAG计算器?但是我不确定如何禁用它。有人可以帮忙吗? 到目前为止,这是我迄今为止所拥有的流媒体“世界”: 问题答案: 你可以使用条件装饰器禁用ETAG中间件。这将使你的响应通过HTTP流回。你可以使用命令行工具(如

  • 问题内容: 我听说过redis-cache,但是它是如何工作的呢?通过以某种方式缓存rdbms查询,它是否被用作Django和我的rdbms之间的一层? 还是应该直接将其用作数据库?我对此表示怀疑,因为该github页面不包含任何登录详细信息,所以没有设置..只是告诉您设置一些config属性。 问题答案: 这个Redis的Python模块在自述文件中有一个清晰的用法示例:http : //git

  • 问题内容: 我正在尝试为我的Django对象获取唯一的ID。在Django 1.8中,它们具有UUIDField。我不确定如何使用此字段来为模型中的每个对象生成唯一的ID。 这是我对UUIDField的要求 我可以重现UUID模型的ID,但是每次我都得到完全相同的ID。:(。 例如: id然后每次都给我相同的id。怎么了,我该如何解决?感谢您的帮助! 问题答案: 我不确定为什么要创建UUID模型。

  • 问题内容: 从Internet的一些示例中,我做了下面的测试代码。有用! …但是,如果我重新加载页面,则饼图将使用相同的图像进行绘制。每次重新加载页面时,某些部件的颜色都会变深。当我重新启动开发服务器时,它将被重置。如何在Django中使用Matplotlib正确绘制?看起来好像还记得一些图纸… 源views.py(让urls.py链接到它): 我正在使用Django 1.0.1和Python 2

  • 问题内容: 我想用datepicker实现django表单。我做了我的forms.py views.py balance.html 而且在该表格的输入框中仍然没有日期选择器。我也尝试像在balance.html中一样在脚本中包含文件链接 datepicker仍然无法正常工作。但是,当在我的html文件中包含jquery时,这也使得我在我的html文件中实现的jquery-treetable无法工作

  • 问题内容: 我应该如何向我的Django网站添加Google+ API登录? 问题答案: 首先,你必须为Google+创建OAuth凭据。 转到Google Developer Console 创建一个新项目。 转到“ API和身份验证”->“授权屏幕”,并为你的产品命名。点击“保存”。 转到“ API和身份验证”->“凭据”。在“ OAuth”下,单击“创建新的客户端ID”。添加“ http:/