1

デフォルトでは、Djangoは日付/時刻をのように表示しますMay 13th, 2010, 4:01 p.m.。また、jQueryカレンダープラグインを構成して(dateFormat: "MM d, yy", timeFormat: "h:mm tt"JavaScriptソースコードを使用し、a.m.andp.m.の代わりにAM出力するように変更しましたPM)、日付/時刻を同じ形式で表示します。

ただし、フォームの検証(デフォルト)は次の形式で行われます。

DATETIME_INPUT_FORMATS = (
    '%Y-%m-%d %H:%M:%S',     # '2006-10-25 14:30:59'
    '%Y-%m-%d %H:%M:%S.%f',  # '2006-10-25 14:30:59.000200'
    '%Y-%m-%d %H:%M',        # '2006-10-25 14:30'
    '%Y-%m-%d',              # '2006-10-25'
    '%m/%d/%Y %H:%M:%S',     # '10/25/2006 14:30:59'
    '%m/%d/%Y %H:%M:%S.%f',  # '10/25/2006 14:30:59.000200'
    '%m/%d/%Y %H:%M',        # '10/25/2006 14:30'
    '%m/%d/%Y',              # '10/25/2006'
    '%m/%d/%y %H:%M:%S',     # '10/25/06 14:30:59'
    '%m/%d/%y %H:%M:%S.%f',  # '10/25/06 14:30:59.000200'
    '%m/%d/%y %H:%M',        # '10/25/06 14:30'
    '%m/%d/%y',              # '10/25/06'
)

を追加しようとしましたが、アカウントがandで'%B %d, %Y, %I:%M %p'あるかどうかわかりません(文字の後のピリオドに注意してください)。日付/時刻形式に関するPythonのドキュメントへのリンクは次のとおりです。%pa.m.p.m.

どうやってこれをするの?Djangoのデフォルトの(醜い)日付/時刻形式をそのまま使用しますform.is_valid()か、それとも(JavaScriptまたはPythonのどちらで)チェックする前に何らかの方法で時刻を変換しますか?


@ThomasOrozcoの編集

CustomDateTimeField私は:という新しいフォームフィールドを作成しました。

class CustomDateTimeField(forms.DateTimeField):
    def strptime(self, value, format):
        return datetime.datetime.strptime(value.replace("a.m.", "AM").replace("p.m.", "PM"), "%B %d, %Y, %I:%M %p")

しかし、私のフォームはそれを使用ModelFormしていfieldsますclass Meta。これが私が意味することです:

def order_edit(request, pk):
    order = Order.objects.get(pk=pk)

    if foo:
        include_fields = (
            'fa_date',
            'sa_date',
        )
    else:
        include_fields = (
            'sa_date',
        )

    class OrderDetailForm(forms.ModelForm):
        class Meta:
            model = Order
            fields = include_fields

    if request.method == 'POST':
        form = OrderDetailForm(data=request.POST, instance=order)

ここでOrder.sa_dateOrder.fa_dateは両方models.DateTimeFieldです。DateTimeInputそして、私はModelFormのにしか使用できないと思いますwidgets。では、どのようにフォームに使用するように指示しCustomDateTimeFieldますOrderEditFormか?次のようなフィールドを介して追加の引数を追加し__init__、手動で再定義する必要がありself.fields['fa_date'] = CustomDateTimeField(...)ますか?

4

2 に答える 2

2

最初の答え

フィールドが特定の形式を受け入れるようにしたい場合、より簡単な解決策は独自のフォーム フィールドを実装することです。Django が効率的な基本クラスを手軽に提供することを考えると、特にここでは非常に簡単です。

実際、 のdjango ソースDateTimeField見ると、 から継承されていることがわかりますBaseTemporalField。したがって、入力形式を受け入れるように、メソッドをサブクラスBaseTemporalField化して実装するだけで済みます。strptime

上記の入力形式は、変数を介してインスタンスに渡される必要がありますinput_formatsが、もう少しコードを書きたい場合は、これは必須ではありません。

DateTimeFieldまた、とのコードをざっと見て、DateFieldインスピレーションを得ることができます。

編集

実際には a のフィールドをオーバーライドできますModelForm。再定義するだけです。ただし、あなたの状況では、条件ブロックを使用してそうすることはできません (ifクラス定義にステートメントを含めることはできません!)。したがって、2 つの解決策があります。

class SAOrderDetailForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ('sa_date',)
    sa_date = CustomDateTimeField()

class FASAOrderDetailForm(SAOrderDetailForm): #Inheritance matters!
    class Meta:
        model = Order
        fields = ('sa_date','fa_date')
    fa_date = CustomDateTimeField()

if foo:
    FormClass = FASAOrderDetailForm
else:
    FormClass = SAOrderDetailForm

別の方法として、フォーム クラスの動的作成を使用することもできますが、それはこの質問の範囲外に見えるため、その方法を説明する James Bennett の投稿を残します。

于 2012-05-27T20:44:24.450 に答える
1

%pレンダリングする内容は、使用しているロケールによって異なります。a.m./を提供するロケールがあるかどうかはわかりませんp.m.

ただし、最も簡単な方法は、フォームフィールドに独自の検証関数を提供することです。これが1回限りのフィールドである場合clean_fieldname(self)は、フォームのメソッドをオーバーライドするだけです(fieldnameは日時フィールドの名前です)。特定のフィールド属性のクリーニングを参照してください。

このフィールドを再利用する場合は、検証ロジックを使用してカスタムフィールドを作成し、カスタム検証が必要なときにインポートして使用します。ウィジェットをカスタマイズして、jqueryセレクターをレンダリングすることもできます。

于 2012-05-27T20:35:17.380 に答える