20

DateFieldのあるフォームがあります。既存の日付値は、次のようにレンダリングされるようにフォーマットされています。

2009-10-03

次のようにフォーマットするにはどうすればよいですか。

03.10.2009

このようにレンダリングするウィジェットを見つけましたが、検証では、そのときに入力した値が許可されません。

4

4 に答える 4

37

適切にフォーマットされた初期フィールド値を表示するには、DateInputウィジェットを使用します。検証をカスタマイズするには、input_formatsのキーワード引数を使用しますDateField

なぜとの両方が必要なのformatですinput_formatsか?

format-このフィールドの初期値が表示される形式。ここを参照してください。

input_formats-文字列を有効なdatetime.dateオブジェクトに変換するために使用される形式のリスト。ここを参照してください。

于 2009-10-03T11:29:09.813 に答える
13

方法 1 : 手動でフォーマットをレンダリングするが、日付フィールドのフォーマット検証に失敗する

したがって、最適なフォーマット ソリューションは "." です。

{{field.value.day|stringformat:"02d"}}.{{field.value.month|stringformat:"02d"}}.{{field.value.year}}

24.05.2010を取得するには

出力値として25.5.2010を取得しないように stringformat:"02d" を追加しました。

アイデアを得るために、フィールドの完全なコードを投稿します。

<input class="form-control" data-inputmask="'mask':'99.99.9999'" data-toggle="masked"  name="{{field.html_name}}" placeholder="{{ field.label }}" {% if field.field.required %}required=""{% endif%} type="text" value="{{field.value.day|stringformat:"02d"}}.{{field.value.month|stringformat:"02d"}}.{{field.value.year}}" " >

主に、更新 (モデル) フォーム (UpdateView クラス) の既存のインスタンスの日付値にこの書式設定を使用しました。

このソリューションは、フォーマットを満たさない場合、更新フォームを送信するときに失敗する可能性があります

方法 2 : (より良い) フィールド値の書式設定を自動化 + 設定を使用して正しい検証を行う

これは、カスタムのローカル設定を settings.py ファイルに追加することによって行われます: 最も重要な部分はDATE_INPUT_FORMATS タプルです

..
..
USE_L10N = True
..

DATE_INPUT_FORMATS = (
    '%d.%m.%Y', '%d.%m.%Y', '%d.%m.%y',  # '25.10.2006', '25.10.2006', '25.10.06'
    '%d-%m-%Y', '%d/%m/%Y', '%d/%m/%y',  # '25-10-2006', '25/10/2006', '25/10/06'
    '%d %b %Y',  # '25 Oct 2006', 
    '%d %B %Y',  # '25 October 2006', 
)

DATE_FORMAT = 'j F Y'
TIME_FORMAT = 'H:i'
DATETIME_FORMAT = 'j F Y H:i'
YEAR_MONTH_FORMAT = 'F Y'
MONTH_DAY_FORMAT = 'j F'
SHORT_DATE_FORMAT = 'j N Y'
SHORT_DATETIME_FORMAT = 'j N Y H:i'
FIRST_DAY_OF_WEEK = 1

最も重要な:

  1. 日付フィールドの検証は、 DATE_INPUT_FORMATSタプルに存在するすべての形式で挿入および更新時に行われます
  2. updateView では、日付フィールドはDATE_INPUT_FORMATS タプルの最初の形式を使用してレンダリングされます( DATE_INPUT_FORMATS[0] == '%d.%m.%Y'を使用することを意味します)。

このタプルでは、​​更新フォームの datefield の既存の値のフォーマットを定義する最初の要素の選択が重要です。

この最初の形式を使用して、UpdateViews に JavaScript 検証を適用することもできます。

django 1.6 および 1.7でテスト済み、以前のバージョンについては不明

于 2014-09-23T01:25:03.547 に答える
6

次のようにカスタム フィールドをサブクラス化します。

class CustomDateField(forms.DateField):
  def __init__(self, *args, **kwargs):
    kwargs.setdefault('input_formats', ("%d.%m.%Y",))
    super(CustomDateField, self).__init__(*args, **kwargs)
于 2009-10-03T12:08:26.007 に答える