DateTimeField ไม่แสดงในระบบผู้ดูแลระบบ


90

ทำไมช่อง "วันที่" ของฉันไม่ปรากฏในระบบผู้ดูแลระบบ

ในไฟล์ 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)

อย่างไรก็ตามในระบบผู้ดูแลระบบข้อมูลจะไม่แสดงแม้ว่ามีการตั้งค่าeditableTrue

ใครมีความคิดบ้าง?

คำตอบ:


59

ฉันเชื่อว่าเหตุผลอยู่กับauto_now_addสนาม

จากคำตอบนี้ :

ช่องใด ๆ ที่มีชุดแอตทริบิวต์ auto_now จะรับช่วง editable = False ด้วยดังนั้นจะไม่ปรากฏในแผงการดูแลระบบ

กล่าวถึงในเอกสารด้วย :

ตามที่ใช้งานอยู่การตั้งค่า auto_now หรือ auto_now_add เป็น True จะทำให้ฟิลด์มีการแก้ไข = False and blank = True set

สิ่งนี้สมเหตุสมผลเนื่องจากไม่มีเหตุผลที่จะต้องแก้ไขฟิลด์ได้หากจะถูกเขียนทับด้วยวันที่และเวลาปัจจุบันเมื่อวัตถุถูกบันทึก


31
แม้ว่าคุณจะสามารถแก้ไขauto_now_addผ่านผู้ดูแลระบบได้หลังจากสร้างรายการครั้งแรกแล้ว?
Christopher Orr

70
คุณควรจะแสดงในอินเทอร์เฟซผู้ดูแลระบบได้แม้ว่าจะไม่สามารถแก้ไขได้ก็ตาม
แบรด

1
โปรดดูคำตอบโดย @hunger ด้านล่างสำหรับวิธีแสดงเป็นฟิลด์แบบอ่านอย่างเดียวในอินเทอร์เฟซผู้ดูแลระบบ
guival

1
มันสมเหตุสมผลที่จะมีฟิลด์ที่สามารถแก้ไขได้หากฟิลด์ถูกแทรกไว้ในการสร้างอ็อบเจ็กต์เท่านั้น (auto_now_add = True)
sergzach

211

หากคุณต้องการดูวันที่ในแผงการดูแลระบบคุณสามารถเพิ่มreadonly_fieldsในadmin.py :

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

admin.site.register(Rating,RatingAdmin)

ฟิลด์ใด ๆ ที่คุณระบุจะถูกเพิ่มสุดท้ายหลังจากฟิลด์ที่แก้ไขได้ ในการควบคุมคำสั่งคุณสามารถใช้fieldsตัวเลือก

ข้อมูลเพิ่มเติมสามารถดูได้จากเอกสาร Django


33
นี่คือคำตอบที่แท้จริง !!
GreenAsJade

4
หากคุณกำหนดว่าfieldsคุณจะต้องใส่ฟิลด์ของคุณลงไปด้วยดังนั้นคุณจะต้องใช้ทั้งในreadonly_fieldsและfieldsอื่น ๆ ฟิลด์จะไม่ปรากฏขึ้น
Bjorn

ฉันแค่อยากจะทราบว่าสิ่งนี้มีผลเช่นกันหากคุณใช้fieldsetsงานเพิ่งพบปัญหานี้ในวันนี้
Kevin Brown

1
สิ่งนี้จะทำให้ฟิลด์ปรากฏเฉพาะเมื่อเราคลิกและเปิดรายการใดรายการหนึ่ง หากคุณต้องการให้ฟิลด์ปรากฏใน listview เองให้stackoverflow.com/a/34966908/4440874
Jyotman Singh

1
โปรดทราบว่าฉันไม่แน่ใจว่าทำไม แต่ดูเหมือนจะใช้ไม่ได้กับ DateTimeFields auto_now_add=Trueภายใต้ Django 1.9 วิธีแก้ปัญหา (เรียงลำดับ) คือเพิ่มลงในlist_displayทูเพิลแทน แก้ไข: จะใช้งานได้หากคุณเพิ่มฟิลด์ของคุณfieldsตามที่ @BjornTipling กล่าวถึง
Taylor Edmiston

23

สับหลัก:

หากคุณจำเป็นต้องทำสิ่งนี้จริงๆ (อย่างที่ฉันทำ) คุณสามารถแฮ็คได้ตลอดเวลาโดยการตั้งค่าฟิลด์ให้ "แก้ไขได้" โดยกำหนดฟิลด์ดังนี้:

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

สิ่งนี้จะทำให้ฟิลด์สามารถแก้ไขได้ดังนั้นคุณจึงสามารถแก้ไขได้จริง ดูเหมือนว่าจะทำงานได้ดีอย่างน้อยก็มีเครื่องยนต์สำรอง mysql ฉันไม่สามารถพูดสำหรับ certian ถ้าร้านค้าสนับสนุนอื่น ๆ จะทำให้เรื่องนี้ไม่เปลี่ยนรูปข้อมูลในฐานข้อมูลและจึงทำให้เกิดปัญหาเมื่อมีการแก้ไขจะพยายามให้เพื่อให้ใช้ด้วยความระมัดระวัง


ไม่อย่าทำเช่นนี้ใช้โซลูชัน readonly_fields ที่อธิบายโดย Hunger
GreenAsJade

2
@GreenAsJade: เหตุผลจะดี
mhsmith

@mhsmith Rationale เพื่อใช้วิธีแก้ปัญหาของ Hunger แทนเนื่องจากนี่เป็นการแฮ็กที่สำคัญและมาพร้อมกับ "ใช้อย่างระมัดระวัง" ในขณะที่โซลูชันของ Hunger ใช้ django ตามวิธีที่ออกแบบมาเพื่อใช้ ทำไมคุณถึงเสี่ยงต่อการถูกแฮ็กครั้งใหญ่เมื่อคุณสามารถทำสิ่งที่ต้องการได้อย่างถูกกฎหมายและได้รับการสนับสนุน
GreenAsJade

6
วิธีแก้แฮ็คนี้ไม่ได้แย่ขนาดนั้น กรณีการใช้งานเพียงกรณีเดียวที่ฉันเห็นคือการทดสอบ - เมื่อผู้ทดสอบจำเป็นต้องเปลี่ยนวันที่
jacoor

2
แค่คำเตือน: แฮ็คนี้ทำให้การย้ายข้อมูลของฉัน
วุ่นวาย

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

ขอบคุณฉันเปลี่ยนมันแล้ว
orblivion

Stackoverflow นั้นยอดเยี่ยมเพราะบางคำตอบทำให้คุณรู้ว่าคุณไม่ได้ถามคำถามที่ถูกต้อง! ขอขอบคุณ.
Samuel Dauzon

5

อาจเกี่ยวข้องกับการที่ auto_now_add เป็นจริง บางทีแทนที่จะใช้พารามิเตอร์นั้นเพื่อจับวันที่เพิ่มคุณสามารถแทนที่เมธอดการบันทึกโมเดลเพื่อแทรกวันที่และเวลาเมื่อ id เป็นโมฆะ

class Rating(models.Model):

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

ถ้าคุณทำเช่นนั้นก็ไม่มีเหตุผลที่จะกำหนดฟิลด์เป็นauto_now
FallenAngel

ไม่แน่ใจว่าทำไมถึงโหวตลด ลิงค์แรกที่ Shawn Chin ระบุถึงแนวทางที่คล้ายกัน
Joe J

นั่นเป็นทางเลือกที่เหมาะสมสมมติว่าจะไม่ได้ใช้และauto_now editable=False+1
Shawn Chin

3

หากคุณต้องการให้ฟิลด์ใด ๆ ปรากฏในรายการรายการทั้งหมดของคุณ (เมื่อคุณคลิกที่โมเดลในผู้ดูแลระบบ) และไม่ใช่เมื่อคุณเปิดรายการนั้น -

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

admin.site.register(Rating, RatingAdmin)

'ชื่อ' เป็นฟิลด์หลักของคุณหรือฟิลด์อื่น ๆ ที่คุณต้องการแสดงในแผงการดูแลระบบ

ด้วยวิธีนี้คุณสามารถระบุคอลัมน์ทั้งหมดที่คุณต้องการดู


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.