【问题标题】:Django ModelChoiceField not adding attrs to html in adminDjango ModelChoiceField 没有在管理员中将 attrs 添加到 html
【发布时间】: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 不起作用吗?

标签: django-admin django-forms


【解决方案1】:

如果您想在点击时切换字段显示,您应该使用 javascript。见:How To Collapse Just One Field in Django Admin?

如果没有,您可以使用__init__ 中的base_fields 动态创建或修改表单:

    if not self.instance.is_virtual:
        ServerAdminForm.host = django.db.models.ForeignKey(u'self', blank=True, null=True)
        ServerAdminForm.base_fields['host'] = ServerAdminForm.host

见:Monkey patching a Django form class?

【讨论】:

  • 谢谢。明天上班时我会研究一下。关于为什么该字段的 html 没有禁用或只读属性的任何想法?
  • javascript 方法效果很好,谢谢。我仍然很好奇为什么我的上述方法失败了。
猜你喜欢
  • 1970-01-01
  • 2010-10-04
  • 2020-12-15
  • 2011-07-10
  • 2011-11-27
  • 2021-10-31
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多