【问题标题】:Django - Admin - on form changeDjango - 管理员 - 表单更改
【发布时间】:2024-11-18 10:05:02
【问题描述】:

我有一个一般性的问题要问 django-admin。

是否可以对表单更改做出反应?

我的 django-admin 详细信息站点中有一个选择字段。每当我从选择字段更改数据时,我都想更改只读字段。

有人处理过这个问题吗?

感谢和问候

【问题讨论】:

  • 你使用的是哪个版本的 Django?
  • 我认为你可以用 JavaScript 做到这一点,伙计。

标签: python django forms django-admin field


【解决方案1】:

Abhijith K 在另一个 SO Q&A 中找到了一个很好的答案:

How can i add a onchange js event to Select widget in Django?

reciept=forms.ChoiceField(reciept_types, widget = forms.Select(attrs = {'onchange': "myFunction();"}))

需要明确的是,这是您在小部件定义中添加的内容:attrs = {'onchange': "myFunction();"} 用于定义将调用哪个 JS 函数,此时触发 onchange 事件。

然后您可以在 ModelAdmin 中定义一个您想要访问的 JavaScript 文件,您可以在其中定义您的函数“myFunction()”:

@admin.register(AnswerTree)
class AnswerTreeAdmin(ModelAdmin):
    form = AnswerTreeForm
    ...

    class Media:
        js = ("admin_js/answertree_modeladmin.js",)

关于在 ModelAdmin 上定义资产(如 JavaScript 和 CSS)的 Django 文档: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#modeladmin-asset-definitions

还有什么好用的,我发现你可以使用attrs = {'onchange': "myFunction(this.value);"}访问输入的值,注意我现在在这里传递参数this.value

JavaScript 函数定义示例:

myFunction = (value) => {
    console.log(value)
}

OR

myFunction(value) {
    console.log(value)
}

【讨论】:

    【解决方案2】:

    我的两分钱:

    正如其他人所说,这是javascript 的作品。在管理页面中,Django 输入jquery。它被称为django.jQuery。所以你会按照@Ashfaq 的建议去做。您将创建一个custom_script.js 并添加到Media 元类中。

    基本上(如@Ashfaq):

    class MyModelAdmin(admin.ModelAdmin):
        class Media:
            js = ("js/custom_script.js",)
    

    custom_script.js 将是这样的(假设您的select 字段被称为id_category):

    django.jQuery( document ).ready(function() {
        console.log( "ready!" );
        django.jQuery('#id_category').change(function() {
          alert( "Handler for #id_category was called." );
        });
    });
    

    ready 函数将保证处理程序正在设置。

    【讨论】:

      【解决方案3】:

      我认为在这里可行的事情是添加 jQuery + 您的自定义 javascript 并使用事件/单击任何您想要的元素。

      class MyModelAdmin(admin.ModelAdmin):
          class Media:
              js = ("js/custom_script.js",)
      

      在 custom_script 中,您可以根据需要添加点击或更改事件。

      【讨论】: