ผู้ดูแลระบบ Django: จะแสดงฟิลด์ที่ถูกทำเครื่องหมายว่าแก้ไขได้ = False 'ในโมเดลได้อย่างไร?


100

แม้ว่าจะมีการระบุช่อง'editable=False'ในแบบจำลอง แต่ฉันต้องการให้หน้าผู้ดูแลระบบแสดง ปัจจุบันมันซ่อนสนามทั้งหมด .. มันจะสำเร็จได้อย่างไร?

คำตอบ:


198

ใช้ฟิลด์แบบอ่านอย่างเดียว เช่นนั้น (สำหรับ django> = 1.2):

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)

6
+1. โดยเฉพาะอย่างยิ่งถ้าคุณไม่ได้วางแผนที่จะแก้ไขฟิลด์เลยใน Admin
Manoj Govindan

สิ่งนี้ใช้ไม่ได้ที่นี่ (Django 2.0) ฟิลด์จะไม่แสดงในอินเทอร์เฟซผู้ดูแลระบบ
nerdoc

1
ฉันเพิ่งสร้างแอปพลิเคชันตัวอย่างเพื่อจำลองข้อผิดพลาดของคุณ (django 2.0.8, python 3.5) ยังคงใช้งานได้ดี อาจมีบางอย่างผิดปกติในแอพของคุณ @nerdoc?
กลับ

โอ๊ะโอ ยิงเร็วโดยทั่วไป ไม่ได้ทดสอบดูเหมือนว่าจะมีปัญหากับการติดตั้งของฉัน ขอบคุณและขอโทษ
nerdoc

2
สำหรับฉันผู้ดูแลระบบล้มเหลวเมื่อฉันเพิ่มลงในfieldsแต่เมื่อฉันเพิ่มลงในreadonly_fieldsนั้นไม่ปรากฏจนกว่าฉันจะเพิ่มลงในทั้งสองอย่างจากนั้นก็ปรากฏในผู้ดูแล
owenfi

18

อัปเดต

โซลูชันนี้มีประโยชน์หากคุณต้องการให้ฟิลด์สามารถแก้ไขได้ใน Admin แต่ไม่สามารถแก้ไขได้ทุกที่ หากคุณต้องการให้ฟิลด์ไม่สามารถแก้ไขได้ตลอดไปคำตอบของ @Till Backhaus คือตัวเลือกที่ดีกว่า

คำตอบเดิม

วิธีหนึ่งในการทำเช่นนี้คือใช้กำหนดเองModelFormในผู้ดูแลระบบ แบบฟอร์มนี้สามารถแทนที่ฟิลด์ที่จำเป็นเพื่อให้สามารถแก้ไขได้ ดังนั้นคุณจึงเก็บไว้ที่editable=Falseอื่นยกเว้นผู้ดูแลระบบ เช่น (ทดสอบกับ Django 1.2.3)

# models.py
class FooModel(models.Model):
    first = models.CharField(max_length = 255, editable = False)
    second  = models.CharField(max_length = 255)

    def __unicode__(self):
        return "{0} {1}".format(self.first, self.second)

# admin.py
class CustomFooForm(forms.ModelForm):
    first = forms.CharField()

    class Meta:
        model = FooModel
        fields = ('second',)

class FooAdmin(admin.ModelAdmin):
    form = CustomFooForm

admin.site.register(FooModel, FooAdmin)

1
วิธีนี้ใช้ไม่ได้ผลอย่างน้อยใน django 1.6 แบบฟอร์มจะแสดงอย่างถูกต้องในแผงผู้ดูแลระบบ แต่เมื่อฉันบันทึกฟอร์มและกลับไปที่ฟอร์มอีกครั้งค่าฟอร์มจะเป็นค่าเริ่มต้นอีกครั้ง
Euphorbium

6

ฟิลด์แบบอ่านอย่างเดียวของคุณต้องอยู่ในฟิลด์ด้วย:

fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')

ขอบคุณสิ่งนี้ช่วยแก้ปัญหาให้ฉันได้ ฉันเพียงแค่วางไว้readonly_fieldsด้านบนและปล่อยให้fieldsเป็นช่องที่แก้ไขได้+ readonly_fields(ทั้งสองเป็น tuples ในรหัสของฉันฉันไม่เห็นว่าทำไมจึงประกาศเป็นรายการ)
Federico S
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.