4

我想根据其他字段值(如“lock_slug”)将 slug 字段设置为 read_only。

意味着会有两个条件。

1) 当 "lock_slug" 的值为 false 时,slug 字段直接从字段 "title" 预填充。

prepopulated_fields = {"slug": ("title",),}

2) 当“lock_slug”的值为真时,slug 字段设为只读。

def get_readonly_fields(self, request, obj = None):
    if obj and obj.lock_slug == True:
        return ('slug',) + self.readonly_fields        
    return self.readonly_fields

这两个独立工作正常,但同时使用时会出现问题。

意味着当我尝试在编辑时添加 get_readonly_fields() 时,由于 prepopulated_fields 会出错。这两个相互崩溃。

将有任何解决方案可以在管理员方面工作。

我也参考下面的链接

根据另一个字段的值在 Django Admin 中使字段只读

django admin 在修改 obj 时将字段设为只读,但在添加新 obj 时需要

但不能同时工作这两个。

谢谢,

米纳克什

4

3 回答 3

7

这是另一种方式:

class PostAdmin(admin.ModelAdmin):
    list_display = (
        'title',
        'slug',
    )
    prepopulated_fields = {'slug': ('title',)}

    def get_readonly_fields(self, request, obj=None):
        if obj:
            self.prepopulated_fields = {}
            return self.readonly_fields + ('slug',)
        return self.readonly_fields
于 2014-01-10T13:08:23.643 回答
2

正如@Rexford 指出的那样,投票最多的答案不适用于最近的 django 版本,因为您不能将 readonly 设置为预填充字段。

顺便说一句,你仍然可以得到你想要的,只需get_prepopulated_fields使用相同的逻辑覆盖该方法,即:

class PageAdmin(admin.ModelAdmin):
    prepopulated_fields = {
        'slug': ('title', ),
    }


    def get_readonly_fields(self, request, obj=None):
        readonly_fields = super().get_readonly_fields(request, obj)
        if request.user.is_superuser:
            return readonly_fields
        return list(readonly_fields) + ['slug', ]

    def get_prepopulated_fields(self, request, obj=None):
        prepopulated_fields = super().get_prepopulated_fields(request, obj)
        if request.user.is_superuser:
            return prepopulated_fields
        else:
            return {}
于 2018-03-21T14:15:55.977 回答
0

我们不能将预填字段设为只读。因此,我创建了未预填充的新字段并在该字段上执行操作,我的问题得到解决。

于 2013-02-12T07:02:37.437 回答