0

私のフォーム内には expiry_date があります....

expiry_date = forms.DateField()

有効期限は MMYY 形式 (2013 年 12 月の場合は 1213) である必要があります。/ または文字は含めないでください。

しかし、これはエンドユーザーにとってはフォームが少し無愛想に見えます。それで、Djangoで2つの選択ボックス1を月に1つ、年に1つ追加して、どうにかしてそれらを元に戻して、投稿前にexpiry_dateを再度作成することは可能ですか?

つまり、ユーザーに月と年の両方のドロップダウンを表示して、代わりにそれを選択してもらいたいのです。

これは私がこれまでに持っているものです....

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')
4

1 に答える 1

2

あなたは基本的に必要ですMultiValueField

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
于 2013-04-11T16:02:07.557 に答える