在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:从 POST 或 GET 预填充值?