web-dev-qa-db-ja.com

DateTimeFieldは管理システムに表示されません

管理システムに「日付」フィールドが表示されないのはなぜですか?

私のadmin.pyファイルには

from Django.contrib import admin
from glasses.players.models import *
admin.site.register(Rating)

評価モデルには、次のような「date」というフィールドがあります

date = models.DateTimeField(editable=True, auto_now_add=True)

ただし、管理システム内では、editableTrueに設定されていても、フィールドは表示されません。

誰にもアイデアがありますか?

73
dotty

auto_now_addフィールド。

この回答 から:

Auto_now属性が設定されたフィールドもeditable = Falseを継承するため、管理パネルには表示されません。

ドキュメント にも記載されています:

現在実装されているように、auto_nowまたはauto_now_addをTrueに設定すると、フィールドにeditable = Falseおよびblank = Trueが設定されます。

オブジェクトが保存されたときに現在の日時でフィールドが上書きされる場合、フィールドを編集可能にする理由がないため、これは理にかなっています。

45
Shawn Chin

管理パネルで日付を確認したい場合は、readonly_fields inadmin.py

class RatingAdmin(admin.ModelAdmin):
    readonly_fields = ('date',)

admin.site.register(Rating,RatingAdmin)

指定したフィールドは、編集可能なフィールドの最後に追加されます。順序を制御するには、fieldsオプションを使用できます。

追加情報は Django docs から入手できます。

175
Hunger

メジャーハック:

本当にこれを行う必要がある場合(私と同じように)、フィールドを「編集可能」に設定して、次のようにフィールドを定義することにより、いつでもハックできます。

class Point(models.Model):
  mystamp=models.DateTimeField("When Created",auto_now_add=True)
  mystamp.editable=True

これによりフィールドが編集可能になるため、実際に変更できます。少なくともmysqlのバッキングエンジンでは、うまく機能しているようです。他のバッキングストアがこのデータをデータベース内で不変にし、編集を試みたときに問題を引き起こすかどうかをcertianに言うことはできませんそのため注意して使用してください

21
Brad

特定のニーズ、および動作の違いのニュアンスに応じて、次のことを実行できます。

from Django.utils.timezone import now

class MyModel(models.Model):
    date = models.DateTimeField(default=now)

デフォルトのフィールドは次のように使用できます。 https://docs.djangoproject.com/en/dev/ref/models/fields/#default

The default value for the field. This can be a value or a callable object. If callable it will be called every time a new object is created.

これはeditableをFalseに設定しません

7
orblivion

Auto_now_addがtrueであることに関係している可能性があります。おそらく、追加時に日付をキャプチャするためのパラメーターの代わりに、モデルのsaveメソッドをオーバーライドして、idがnullのときにdatetimeを挿入できます。

class Rating(models.Model):

    ....
    def save(self, *args, **kwargs)
        if not self.id: 
            self.date = datetime.datetime.now()
5
Joe J

特定のエントリを開いたときではなく、すべてのエントリのリストにフィールドを表示したい場合(管理者のモデルをクリックした場合)-

class RatingAdmin(admin.ModelAdmin):
    list_display = ('name', 'date') 

admin.site.register(Rating, RatingAdmin)

「名前」はメインフィールドまたは管理パネルに表示する他のフィールドです。

これにより、表示するすべての列を指定できます。

3
Jyotman Singh

あなたはそれを行うことはできません、 ドキュメント を確認してください

auto_nowおよびauto_now_addはすべて編集不可フィールドであり、オーバーライドできません...

0
FallenAngel