0

デフォルトの DateField() 検証では、月、日、年を挿入するために使用できる形式がいくつかあります。ただし、ユーザーが年または月、日、年のみを入力できるようにする必要があります。

たとえば、同じフィールドに「5/10/2003」または「2003」を挿入すると、検証に合格します。また、'2003' が挿入された場合、'1/1/2003' (または同様のもの) にデフォルト設定する必要がありますか、それともこれを行うためのより良い方法はありますか?

最後に、モデル内で clean() メソッドをオーバーライドして、複数のフォームでコードを再利用する必要がないようにすることはできますか? すなわち:

class Project(models.Model):
    name = models.CharField(max_length=100)
    start_date = models.DateField()
    ## other fields

    def clean(self):
        # clean other fields as normal

        # override start_date

または、次のようになります。

def validate_date(value):
    """ Validate date to allow YYYY """
    ## Raise error on Validation fail

class Project(models.Model):
    name = models.CharField(max_length=100)
    start_date = models.DateField()
    ## other fields

    def clean(self):
        # clean other fields as normal

        # override start_date
4

1 に答える 1

0

カスタム フォーム フィールドの作成に関するドキュメントはまばらですが、可能です。

from django import forms


class MonthDateYearOrYearField(forms.DateField):
    def clean(self, value):
        date_length = len(value)

        if date_length == 4:  # 2003
            value = '1/1/{year}'.format(year=value)
        elif 8 <= date_length <= 10:  # 5/10/2003, 05/10/2003, 5/9/2009
            pass
        else:
            raise forms.ValidationError('date format must be "MM/DD/YYYY" or "YYYY"')

        return super(MonthDateYearOrYearField, self).clean(value)

class Project(forms.Form):
    start_date = MonthDateYearOrYearField()

条件にはelifおそらくいくつかの作業が必要ですが、アイデアはわかります。

于 2013-11-13T21:07:52.140 に答える