web-dev-qa-db-ja.com

Django:DateFieldの日付表現をフォーマットする方法は?

DateFieldを含むフォームがあります。既存の日付値は、次のように表示されるようにフォーマットされています。

2009-10-03

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

03.10.2009

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

19
falstaff

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

formatinput_formatsの両方が必要なのはなぜですか?

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

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

37
Cat Plus Plus

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

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

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

入手するには2010.05.24

Stringformat: "02d"を追加して、出力値として25.5.201を取得しません。

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

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

したがって、更新フォームの日付フィールドの既存の値のフォーマットを定義するため、このタプルでは最初の要素の選択が重要です。

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

Django 1.6および1.7でテスト済み、以前のバージョンでは不明

11
Cherif KAOUA

このようなサブクラスのカスタムフィールド:

class CustomDateField(forms.DateField):
  def __init__(self, *args, **kwargs):
    kwargs.setdefault('input_formats', ("%d.%m.%Y",))
    super(CustomDateField, self).__init__(*args, **kwargs)
6
sorki

テンプレートを使用して日付を表示できます

{{ your_object.date_field.day }}.{{ your_object.date_field.month }}.{{ your_object.date_field.year }}
4
qscgyjqscgyj