[英]Django form split into two drop down (selects)
Within my form I have expiry_date.... 在我的表格中,我有expiry_date ....
expiry_date = forms.DateField()
The expiry date MUST be in MMYY format ie 1213 for December 2013. No / or characters should be included. 到期日必须是MMYY格式,即2013年12月的1213.不应包括字符。
But this looks to the end user a bit naf in the form. 但这看起来最终用户在形式上有点naf。 So, is it possible in Django to add in two select box 1 for month, 1 for year, then somehow put them back together to make expiry_date again before post?
那么,Django有可能在月份中添加两个选择框1,每年添加1个,然后以某种方式将它们重新组合在一起以便在发布之前再次使用expiry_date吗?
ie I want my user to see a drop down for both month and year and select that instead. 即我希望我的用户看到月份和年份的下拉菜单,然后选择它。
This is what I have so far.... 这就是我到目前为止......
CARD_CHOICES = [
('VISA', 'VISA'),
('MC', 'MasterCard'),
('DELTA', 'DELTA'),
('MAESTRO', 'Maestro'),
('UKE', 'Visa Electron'),
]
DATE_INPUT_FORMATS = ('MMYY',)
class OrderForm(forms.Form):
"""
Order Form used to collect data ready for processing.
"""
amount = forms.FloatField()
expiry_date = forms.DateField(input_formats=DATE_INPUT_FORMATS)
CSV = forms.CharField(max_length=3)
card_type = forms.TypedChoiceField(choices=CARD_CHOICES, initial='VISA')
You basically need a MultiValueField
你基本上需要一个
MultiValueField
Here is an example implementation from: django-creditcard app 以下是来自django-creditcard app的示例实现
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.