Django表单拆分为两个下拉列表(选择)

2024-04-28 22:04:44 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的表格中我有有效期。。。。在

expiry_date = forms.DateField()

有效期必须为MMYY格式,即2013年12月为1213。不应包含/或字符。在

但在最终用户看来,这在形式上有点不合理。那么,在Django中,是否可以添加两个选择框1表示月份,1表示年份,然后以某种方式将它们组合在一起,以便在发布之前再次确定过期日期?在

也就是说,我想让我的用户看到一个月和年的下拉列表,然后选择它。在

这就是我目前所掌握的。。。。在

^{pr2}$

Tags: djangodate格式方式forms字符形式表格
1条回答
网友
1楼 · 发布于 2024-04-28 22:04:44

你基本上需要一个MultiValueField

下面是来自:django-creditcardapp的示例实现

class ExpiryDateField(forms.MultiValueField):
    """
    Form field that validates credit card expiry dates.
    """

    default_error_messages = {
        'invalid_month': _(u'Please enter a valid month.'),
        'invalid_year': _(u'Please enter a valid year.'),
        'date_passed': _(u'This expiry date has passed.'),
    }

    def __init__(self, *args, **kwargs):
        today = date.today()
        error_messages = self.default_error_messages.copy()
        if 'error_messages' in kwargs:
            error_messages.update(kwargs['error_messages'])
        if 'initial' not in kwargs:
            # Set default expiry date based on current month and year
            kwargs['initial'] = today
        months = [(x, '%02d (%s)' % (x, date(2000, x, 1).strftime(MONTH_FORMAT))) for x in xrange(1, 13)]
        years = [(x, x) for x in xrange(today.year, today.year + 15)]
        fields = (
            forms.ChoiceField(choices=months, error_messages={'invalid': error_messages['invalid_month']}),
            forms.ChoiceField(choices=years, error_messages={'invalid': error_messages['invalid_year']}),
        )
        super(ExpiryDateField, self).__init__(fields, *args, **kwargs)
        self.widget = ExpiryDateWidget(widgets=[fields[0].widget, fields[1].widget])

    def clean(self, value):
        expiry_date = super(ExpiryDateField, self).clean(value)
        if date.today() > expiry_date:
            raise forms.ValidationError(self.error_messages['date_passed'])
        return expiry_date

    def compress(self, data_list):
        if data_list:
            try:
                month = int(data_list[0])
            except (ValueError, TypeError):
                raise forms.ValidationError(self.error_messages['invalid_month'])
            try:
                year = int(data_list[1])
            except (ValueError, TypeError):
                raise forms.ValidationError(self.error_messages['invalid_year'])
            try:
                day = monthrange(year, month)[1] # last day of the month
            except IllegalMonthError:
                raise forms.ValidationError(self.error_messages['invalid_month'])
            except ValueError:
                raise forms.ValidationError(self.error_messages['invalid_year'])
            return date(year, month, day)
        return None

相关问题 更多 >