8

現地時間とタイムゾーンに従ってAdminでDateTimeFieldをフォーマットする方法は?

私のsettings.py:

    TIME_ZONE = 'Europe/Bratislava'
    LANGUAGE_CODE = 'en-us'
    USE_I18N = True
    USE_L10N = True
    USE_TZ = True

pytzパッケージがインストールされます。

モデル:

class Material(models.Model):
    category = models.ForeignKey(Category, null=True, blank=True) 
    code = models.CharField(max_length=10)
    description = models.CharField(max_length=30, blank=True, null=True)
    modified = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

また、設定で日付の書式設定を試しましたが、管理者リストの表示で日時オブジェクトが文字列に変換される方法は変更されていません。

DATETIME_FORMAT = 'd N Y'
DATE_FORMAT = 'd N Y'

データベースに日時が正しく保存されている「2012-11-2008:57:15.901341+01」。ただし、adminで表示される場合は、常にUTCで表示されます。

ModelAdminでフォーマットを処理するメソッドを準備できますが、管理者クラスが次のようになりたいので、実際にはDRYではありません。

from django.utils.timezone import localtime

class MaterialAdmin(admin.ModelAdmin):
    list_display = ('code', 'modified_local', 'created')

    def modified_local(self, row):
        return localtime(row.modified)
    modified_local.admin_order_field = 'modified'
    modified_local.short_description = 'Modified'
4

1 に答える 1

9

あなたの質問への答えは、Django プロジェクトの適切な構成settingsですformats。サンプルプロジェクトの構造:

.
|-- README.md
|-- demo.db
|-- demo_time_set
|   |-- __init__.py
|   |-- demo.db
|   |-- formats
|   |   |-- __init__.py
|   |   `-- en
|   |       |-- __init__.py
|   |       `-- formats.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
|-- manage.py
|-- requirments.txt
`-- some_app
    |-- __init__.py
    |-- admin.py
    `-- models.py

ディレクトリに適切な名前とformats.pyを指定するだけで、複数の言語用に定義できます。すべての MAGIC が発生する場所のコンテンツの例はformats.py、次のようになります。

# HERE FORMATING AS shown in:
# LIST: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
DATE_FORMAT = 'd-m-Y'
TIME_FORMAT = 'H:i'
DATETIME_FORMAT = 'd-m-Y H:i'
YEAR_MONTH_FORMAT = 'F Y'
MONTH_DAY_FORMAT = 'F j'
SHORT_DATE_FORMAT = 'm/d/Y'
SHORT_DATETIME_FORMAT = 'm/d/Y P'
FIRST_DAY_OF_WEEK = 1

# BUT here use the Python strftime format syntax,
# LIST: http://docs.python.org/library/datetime.html#strftime-strptime-behavior

DATE_INPUT_FORMATS = (
    '%d-%m-%Y',     # '21-03-2014'
)
TIME_INPUT_FORMATS = (
    '%H:%M:%S',     # '17:59:59'
    '%H:%M',        # '17:59'
)
DATETIME_INPUT_FORMATS = (
    '%d-%m-%Y %H:%M',     # '21-03-2014 17:59'
)

DECIMAL_SEPARATOR = u'.'
THOUSAND_SEPARATOR = u','
NUMBER_GROUPING = 3

コメント内の 2 つのリンクに注意してください。適切な構成のリストが表示されますが、これらは異なるパーツでは異なります。

settings.py追加するだけで:

FORMAT_MODULE_PATH = 'demo_time_set.formats'

[GITHUB] 完全に機能する例を次に示します: https://github.com/andilab/demo_time_set

于 2014-03-21T17:13:32.617 に答える