在Django Admin中将预填充的段塞字段设置为只读

时间:2013-01-28 13:20:15

标签: django-admin

我想将slug字段设为read_only,具体取决于“lock_slug”等其他字段值。

意味着会有两个条件。

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

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

2)当“lock_slug”的值为true时,slug字段为readonly。

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_field而出错。这两个相互崩溃。

在管理员方面都有任何解决方案。

我也参考下面的链接

Making a field readonly in Django Admin, based on another field's value

django admin make a field read-only when modifying obj but required when adding new obj

但不能同时处理这两个问题。

谢谢,

米纳克什

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

正如@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 {}

答案 2 :(得分:-1)

我们无法将预先填充的字段设为read_only。所以我创建了一个没有预先填充的新字段,并在该字段上执行操作,我的问题就解决了。