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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Django Admin中将预填充的段塞字段设置为只读相关的知识,希望对你有一定的参考价值。

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

意味着将有两个条件。

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

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

2)当“lock_slug”的值为真时,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

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

谢谢,

米纳克什

答案

这是另一种方式:

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
另一答案

正如@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 
另一答案

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

以上是关于在Django Admin中将预填充的段塞字段设置为只读的主要内容,如果未能解决你的问题,请参考以下文章

在 Django Admin FilteredSelectmultiple 小部件中预填充选定值

在 Django Admin 中基于父模型预填充内联

Django Admin:从 POST 或 GET 预填充值?

如何在 Django Rest Framework 中将当前用户设置为用户字段?

django 中的预填充字段无法正常工作

编辑时的 Django FormWizard 预填充