如何使一些 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