Quản trị viên Django: Làm thế nào để hiển thị trường được đánh dấu là có thể chỉnh sửa = Sai 'trong mô hình?


99

Mặc dù một trường được đánh dấu là 'editable=False'trong mô hình, tôi muốn trang quản trị hiển thị nó. Hiện tại, nó ẩn toàn bộ lĩnh vực này .. Làm thế nào để đạt được điều này?

Câu trả lời:


195

Sử dụng Trường chỉ đọc . Như vậy (đối với django> = 1.2):

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

6
+1. Đặc biệt nếu bạn không có kế hoạch chỉnh sửa trường nào trong Admin.
Manoj Govindan

Điều này không hoạt động ở đây (Django 2.0). Sau đó, trường không được hiển thị trong giao diện quản trị.
nerdoc

1
Tôi vừa tạo một ứng dụng mẫu để tái tạo lỗi của bạn (django 2.0.8, python 3.5). Điều này vẫn hoạt động tốt. Có thể có điều gì đó sai khác trong ứng dụng @nerdoc của bạn?
tback

Rất tiếc. Bắn nhanh điển hình. Không kiểm tra, có vẻ như là một vấn đề với cài đặt của tôi. Cảm ơn, và xin lỗi.
nerdoc

2
Đối với tôi, quản trị viên đã bị lỗi khi tôi thêm nó vào fields, nhưng khi tôi thêm nó vào readonly_fieldsthì nó không hiển thị cho đến khi tôi thêm nó vào cả hai và sau đó nó xuất hiện trong admin.
owenfi

18

Cập nhật

Giải pháp này hữu ích nếu bạn muốn giữ trường có thể chỉnh sửa trong Quản trị nhưng không thể chỉnh sửa ở mọi nơi khác. Nếu bạn muốn giữ trường không thể chỉnh sửa trong suốt thì câu trả lời của @Till Backhaus là lựa chọn tốt hơn.

Câu trả lời gốc

Một cách để làm điều này là sử dụng một tùy chỉnh ModelFormtrong quản trị viên. Biểu mẫu này có thể ghi đè trường bắt buộc để có thể chỉnh sửa được. Qua đó bạn giữ lại editable=Falsemọi nơi khác ngoài Admin. Ví dụ: (thử nghiệm với 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
Điều này không hoạt động, ít nhất là trên django 1.6 Biểu mẫu được hiển thị chính xác trong bảng điều khiển quản trị, nhưng khi tôi lưu biểu mẫu và quay lại biểu mẫu đó, giá trị biểu mẫu lại được mặc định.
Euphorbium

4

Các trường chỉ đọc của bạn cũng phải nằm trong các trường:

fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.