当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Django MultiWidget.get_context用法及代码示例


本文介绍 django.forms.MultiWidget.get_context 的用法。

声明

get_context(name, value, attrs)

除了 Widget.get_context() 中说明的 'widget' 键之外,MultiWidget 添加了 widget['subwidgets'] 键。

这些可以在小部件模板中循环:

{% for subwidget in widget.subwidgets %}
    {% include subwidget.template_name with widget=subwidget %}
{% endfor %}

这是一个示例小部件,它继承了 MultiWidget 以在不同的选择框中显示带有日、月和年的日期。此小部件旨在与 DateField 而不是 MultiValueField 一起使用,因此我们实现了 value_from_datadict()

from datetime import date
from django import forms

class DateSelectorWidget(forms.MultiWidget):
    def __init__(self, attrs=None):
        days = [(day, day) for day in range(1, 32)]
        months = [(month, month) for month in range(1, 13)]
        years = [(year, year) for year in [2018, 2019, 2020]]
        widgets = [
            forms.Select(attrs=attrs, choices=days),
            forms.Select(attrs=attrs, choices=months),
            forms.Select(attrs=attrs, choices=years),
        ]
        super().__init__(widgets, attrs)

    def decompress(self, value):
        if isinstance(value, date):
            return [value.day, value.month, value.year]
        elif isinstance(value, str):
            year, month, day = value.split('-')
            return [day, month, year]
        return [None, None, None]

    def value_from_datadict(self, data, files, name):
        day, month, year = super().value_from_datadict(data, files, name)
        # DateField expects a single string that it can parse into a date.
        return '{}-{}-{}'.format(year, month, day)

构造函数在列表中创建几个 Select 小部件。 super() 方法使用此列表来设置小部件。

所需的方法 decompress() datetime.date 值分解为与每个小部件对应的日、月和年值。如果选择了无效的日期,例如不存在的 2 月 30 日,则 DateField 会改为将此方法传递给字符串,因此需要解析。当 valueNone 时,最后的 return 处理,这意味着我们的子小部件没有任何默认值。

value_from_datadict() 的默认实现返回与每个 Widget 对应的值列表。这适用于将 MultiWidget MultiValueField 一起使用。但由于我们想将此小部件与 DateField 一起使用,它采用单个值,因此我们重写了此方法。这里的实现将来自子小部件的数据组合成 DateField 期望格式的字符串。

相关用法


注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.forms.MultiWidget.get_context。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。