我在Django admin中有表格内联的表单:
class MemberAdminInline(admin.TabularInline):
model = Member
fields = ("first_name", "last_name")
readonly_fields = ("first_name", )
class GroupAdmin(admin.ModelAdmin):
model = Group
fields = ("name", "description")
inlines = [MemberAdminInline]
我想有条件地显示会员last_name
。即
"If first_name = "Joe": don't display show field for last_name".
重要的是不要显示字段而不隐藏它(例如使用JS),
因为在我的实际工作场景中,在某些情况下,这个字段可以包含一个二进制数据,当通过表单时它会被破坏。
即
我希望last_name
只能通过管理员对某些first_name
进行编辑。
我尝试过提供内联和有条件删除字段的自定义表单,或者在各个阶段动态包含readonly_fields
列表中的字段,但Django仍然总是试图找到我要隐藏字段的字段
Django 1.3.1
答案 0 :(得分:1)
似乎Django在内联创建时计算formset的字段列表,然后formset坚持要求这些字段存在。
因此,我发现克服此问题的唯一方法是在需要时实际忽略已保存的值:
class MemberAdminInlineForm(forms.ModelForm):
def clean_last_name(self):
if hasattr(self, "instance"):
if self.instance.first_name == "Joe":
return self.instance.last_name
return self.cleaned_data["last_name"].
class MemberAdminInline(admin.TabularInline):
model = Member
fields = ("first_name", "last_name")
readonly_fields = ("first_name", )
form = MemberAdminInlineForm