當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。