【问题标题】:Make the prepopulated slug field as readonly in Django Admin在 Django Admin 中将预填充的 slug 字段设置为只读
【发布时间】:2013-01-11 20:16:57
【问题描述】:

我想根据“lock_slug”等其他字段值将 slug 字段设为 read_only。

意味着会有两个条件。

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

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

2) 当 "lock_slug" 的值为 true 时,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 会出错。这两个相互崩溃。

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

我也参考下面的链接

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

但不能同时使用这两个。

谢谢,

米纳克什

【问题讨论】:

    标签: django-admin


    【解决方案1】:

    这是另一种方式:

    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
    

    【讨论】:

    • 2016 年,这行不通。如果字段是只读的,这意味着它不会显示,并且预填充的字段将没有可预填充的内容。我收到了u"Key 'slug' not found in 'theModelForm'.
    • 在 2021 年,这有效并解决了我的问题 :)
    【解决方案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 {}
    

    【讨论】:

    • 谢谢,这是一个绝妙的解决方案!我在游戏中添加了super(),因此会考虑对父方法的更改和更新。
    【解决方案3】:

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

    【讨论】:

    • 这个问题的新答案是更好的解决方案。
    猜你喜欢
    • 2019-04-14
    • 2018-06-12
    • 2010-11-26
    • 2011-08-09
    • 2019-08-14
    • 2016-12-22
    • 2019-03-14
    • 2019-03-19
    • 1970-01-01
    相关资源
    最近更新 更多