Django - 管理员 - 表单更改
Posted
技术标签:
【中文标题】Django - 管理员 - 表单更改【英文标题】:Django - Admin - on form change 【发布时间】:2019-04-25 11:46:47 【问题描述】:我有一个一般性的问题要问 django-admin。
是否可以对表单更改做出反应?
我的 django-admin 详细信息站点中有一个选择字段。每当我从选择字段更改数据时,我都想更改只读字段。
有人处理过这个问题吗?
感谢和问候
【问题讨论】:
你使用的是哪个版本的 Django? 我认为你可以用 javascript 做到这一点,伙计。 【参考方案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 中,您可以根据需要添加点击或更改事件。
【讨论】:
以上是关于Django - 管理员 - 表单更改的主要内容,如果未能解决你的问题,请参考以下文章
为我的应用程序之外的单个模型覆盖 django 管理员更改表单?