我想将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
但不能同时处理这两个问题。
谢谢,
米纳克什
答案 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。所以我创建了一个没有预先填充的新字段,并在该字段上执行操作,我的问题就解决了。