DateTimeFieldが管理システムに表示されない


87

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

私のadmin.pyファイルに私は持っています

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

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

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

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

誰か考えがありますか?

回答:


55

私は理由がauto_now_addフィールドにあると信じています。

この答えから:

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

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

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

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


31
確か、エントリが最初に作成されたauto_now_add管理者を介して編集できるはずですが?
クリストファーオア2011

68
編集できない場合でも、管理インターフェースに簡単に表示できるはずです。
ブラッド

1
管理インターフェースで読み取り専用フィールドとして表示する方法については、以下の@hungerによる回答を参照してください。
guival 2016

1
フィールドがオブジェクトの作成時にのみ初期化される場合(auto_now_add = True)、フィールドを編集可能にすることは理にかなっています。
sergzach 2016

206

管理パネルで日付を本当に確認したい場合はreadonly_fieldsadmin.pyに追加できます。

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

admin.site.register(Rating,RatingAdmin)

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

追加情報は、Djangoのドキュメントから入手できます。


33
これが本当の答えです!!
GreenAsJade 2014

4
を指定する場合fieldsは、フィールドもその中に配置する必要があるため、両方で必要にreadonly_fieldsなりfieldsます。そうしないと、フィールドが表示されません。
ビョルン2014

を使用している場合にもこれが適用されることに注意したかったのですがfieldsets、今日この問題が発生しました。
ケビンブラウン

1
これにより、特定のエントリをクリックして開いたときにのみフィールドが表示されます。フィールドをリストビュー自体に表示したい場合は、stackoverflow.com
a / 34966908/4440874

1
理由はわかりませんが、Django1.9ではDateTimeFieldsでは機能しないようですauto_now_add=True。(一種の)回避策は、list_display代わりにそれらをタプルに追加することです。編集:fields@BjornTiplingが述べたように、フィールドもに追加すると機能します。
テイラーエドミストン2016

23

メジャーハック:

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

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

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


いや、これをしないでください。Hungerによって記述されたreadonly_fieldsソリューションを使用してください。
GreenAsJade 2014

2
@GreenAsJade:理論的根拠があればいいのですが。
mhsmith 2015

@mhsmithこれの代わりにHungerのソリューションを使用する理由:これは主要なハックであり、「注意して使用する」必要があるため、Hungerのソリューションは使用するように設計された方法でdjangoを使用します。正当でサポートされた方法で必要なことを実行できるのに、なぜ大規模なハッキングのリスクを冒すのでしょうか。
GreenAsJade 2015

6
このハックソリューションはそれほど悪くはありません。ただし、その唯一の使用例はテストです。テスターが日付を変更する必要がある場合です。
jacoor 2015

2
ただの警告:このハックは私にとって移行を台無しにしました
damio 2017

16

特定のニーズ、および動作の違いの微妙な違いに応じて、次のことができます。

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.

これは編集可能に設定されません False


1
from django.utils.timezone import now代わりに使用しますがdatetime.now、これは有望に見えます。
amjoconn 2015年

おかげで、私はそれを変更しました。
orblivion 2015年

Stackoverflowは素晴らしいです。なぜなら、いくつかの答えは、あなたが正しい質問をしなかったことに気付くからです!ありがとうございました。
サミュエルドーゾン

5

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

class Rating(models.Model):

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

そうした場合、フィールドをauto_now
FallenAngel

なぜ反対票を投じたのかわからない。Shawn Chinが提供する最初のリンクは、同様のアプローチを示しています。
ジョーJ

auto_nowが使用されていないと仮定すると、これは賢明な代替手段editable=Falseです。+1
ショーンチン

3

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

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

admin.site.register(Rating, RatingAdmin)

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

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


0

それはできません。ドキュメントを確認してください

auto_nowauto_now_addはすべて編集不可能なフィールドであり、オーバーライドすることはできません...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.