如何使一些 Django 内联只读
How to make some Django Inlines Read Only
我正在使用 django admin 并将 TabularInline
添加到我的 ModelAdmin class。想想Author
,内联是Books
。如何根据每个特定内联模型实例的某些特征,使其中一些内联显示为只读,而另一些显示为可编辑?假设我希望所有 2001 年之前写的书都是只读的。之后写的所有书都是可编辑的。
我尝试在 TablularInline 上覆盖 has_change_permission()
并使用 obj
参数,但它接收的是父级而不是此特定内联的实例。
您必须覆盖内联表单并检查 __init__()
中实例的值。
示例:
class AuthorBookInlineForm(forms.ModelForm):
model = Book
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance and self.instance.created_ts.year <= 2001:
for f in self.fields:
self.fields[f].widget.attrs['readonly'] = 'readonly'
不要忘记在内联中设置表单值...
class AuthorBookInline(admin.TabularInline):
model = Book
form = AuthorBookInlineForm
extra = 0
我正在使用 django admin 并将 TabularInline
添加到我的 ModelAdmin class。想想Author
,内联是Books
。如何根据每个特定内联模型实例的某些特征,使其中一些内联显示为只读,而另一些显示为可编辑?假设我希望所有 2001 年之前写的书都是只读的。之后写的所有书都是可编辑的。
我尝试在 TablularInline 上覆盖 has_change_permission()
并使用 obj
参数,但它接收的是父级而不是此特定内联的实例。
您必须覆盖内联表单并检查 __init__()
中实例的值。
示例:
class AuthorBookInlineForm(forms.ModelForm):
model = Book
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance and self.instance.created_ts.year <= 2001:
for f in self.fields:
self.fields[f].widget.attrs['readonly'] = 'readonly'
不要忘记在内联中设置表单值...
class AuthorBookInline(admin.TabularInline):
model = Book
form = AuthorBookInlineForm
extra = 0