【发布时间】:2011-06-24 20:20:31
【问题描述】:
我正在尝试编写一个 Django 应用程序,但在为我的一个模型自定义管理员时遇到了一些困难。
这是我正在使用的模型的简化版本:
class Server(django.db.models.Model):
name = django.db.models.CharField(max_length=40)
is_virtual = django.db.models.BooleanField()
host = django.db.models.ForeignKey(u'self', blank=True, null=True)
这是我试图绑定到管理员的表单:
class ServerAdminForm(forms.ModelForm):
class Meta:
model = models.Server
def __init__(self, *args, **kwargs):
super(ServerAdminForm, self).__init__(*args, **kwargs)
if not self.instance.is_virtual:
# I don't know why these are not working
self.fields['host'].widget.attrs['disabled'] = 'disabled'
self.fields['host'].widget.attrs['readonly'] = True
这里是管理代码(实际上还有更多的字段和其他字段集):
class ServerAdmin(admin.ModelAdmin):
fieldsets = (
(None, {
'fields': ('name', 'is_virtual', 'host')
}),
)
form = admin_forms.ServerAdminForm
save_as = True
我的目标是让管理员仅在 is_virtual 为 True 时才显示主机字段。我尝试从字段中删除主机并在上面的 init 表单中将其设置为无,但这两个都使页面崩溃,因为我将它列在字段集中。
所以我的第一个问题是:有没有一种干净的方法可以根据实例动态修改字段集?我尝试了这种方法几个小时,但在 google 和 django 文档上一无所获。
在上述方法失败后,我决定尝试在 is_virtual 为 False 时禁用 ModelChoiceField。那是我上面的表单代码。当我单步执行代码时,一切似乎都设置正确,但是当我查看 html 源代码时,我看不到 disabled 或 readonly 属性。我尝试将主机切换到 CharField 以查看是否改变了任何内容,当我查看 html 时,属性已设置。
我不确定我是否在文档中遗漏了一些内容,即您无法禁用 ModelChoiceFields,或者我只是做错了什么,但我希望能提供有关如何禁用 ModelChoiceField 的任何建议。
所以我正在寻找一种基于实例动态修改字段集的方法,或者一种禁用 ModelChoiceField 的方法。如果您认为有更好的方法来解决这个问题,我也愿意接受其他方法来解决这个问题。
提前感谢您的帮助。
更新
我能够使用所选答案中的 javascript 方法获得所需的结果。
然而,我仍然很好奇为什么我使用 self.fields['host'].widget.attrs 的方法对 ModelChoiceField 不起作用。
【问题讨论】:
-
嗨,JSchrantz,你能弄清楚为什么设置小部件属性对 ModelChoiceField 不起作用吗?