gpt4 book ai didi

django - 如何使用 Django 的 MultiWidget?

转载 作者:行者123 更新时间:2023-11-28 19:34:44 26 4
gpt4 key购买 nike

关于此功能的文档有点缺乏。

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 小部件吗?

最佳答案

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

这是来自 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
  • 实现了一个构造函数,该构造函数在一个元组。这很重要,因为父类(super class)使用此元组的存在来为您处理几件事。
  • 我的格式输出是直通的,但我的想法是您可以根据需要在此处添加自定义 html
  • 我还实现了decompress,因为您必须这样做——您应该期望在单个value 对象中从数据库传递值。 decompress 将其分解以显示在小部件中。您在此处的操作方式和操作由您决定,并取决于小部件。

我没有但可以覆盖的东西:

  • render,这个实际上是负责渲染widgets的,所以如果你继承它,你肯定需要调用super 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 . 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 类的重要部分。您尝试做的事情取决于您创建的内容/您正在使用的小部件,这就是为什么我不能轻易详细介绍的原因。但是,如果您想自己查看基类并查看评论,请查看 the source .

关于django - 如何使用 Django 的 MultiWidget?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3511855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com