【问题标题】:Prepopulate drop-box according to another drop-box choice in Django Admin根据 Django Admin 中的另一个下拉框选择预填充下拉框
【发布时间】:2010-06-08 19:40:36
【问题描述】:

我有这样的模型:

class User(models.Model): 
    Switch = models.ForeignKey(Switch, related_name='SwitchUsers') 
    Port = models.ForeignKey(Port) 
class Switch(models.Model): 
    Name = models.CharField(max_length=50) 
class Port(models.Model): 
    PortNum = models.PositiveIntegerField() 
    Switch = models.ForeignKey(Switch, related_name = "Ports") 

当我在管理界面并从可用的交换机中选择交换机时,我希望使用相关交换机的端口相应地预先填充端口。 据我了解,我需要创建一些 JS 脚本来预填充它。不幸的是,我没有这种经验,我想尽可能保持简单,不要重写所有 Django 管理界面。只需为一个字段添加此功能。

你能帮我解决我的问题吗?谢谢你。

【问题讨论】:

    标签: jquery python django


    【解决方案1】:

    您是正确的,您需要一些 js 来创建它。您不需要重新编写 django 管理界面。您只需要自定义它。这种类型的东西需要一些东西。

    从这里开始:http://docs.djangoproject.com/en/1.2/ref/contrib/admin/#modeladmin-objects

    要包含您的 javascript,请使用 Media class

    django 表单为所有表单输入提供一致的 id,因此很容易操作它们。但是,您需要将您的关系“传递”给客户。我的意思是,在客户端上,您需要知道哪个Ports 与哪个Switch 搭配使用。根据您拥有的数据量,有以下几种方法:

    • 将关系编码为 json 并在标签中为您的模型输出customizing the admin template

    • 使用 ajax。您至少需要一个额外的视图,该视图采用 Switch 并为与之配套的 Ports 返回一个 json 列表(或类似的东西)。

    javascript 操作应该是直截了当的:您希望将 Dropbox 的 onChange() 事件绑定到一个函数,该函数会在 Port Dropbox 中剥离除相关 Ports 之外的所有内容。

    我建议使用jquery 进行 DOM 操作。

    【讨论】:

      【解决方案2】:

      您最终可以获得比上面提供的更简单的解决方案。 与其自定义模板并将 json 放在标签中,不如将此 json 放在 js 文件的开头,还放在那里 $().ready 调用,它将将侦听器分配给选择框更改事件,并将此 js 文件引用到ModelAdmin 的媒体。

      class MyAdmin(admin.ModelAdmin):
          class Media:
              js = ("my_code.js",)
      

      提示:使用 Firebug 或 Chrome 检查器检查表单上 HTML 字段的真实名称。

      【讨论】:

      • 感谢您的评论。看起来是实现我需要的最简单的方法。只有一个关于 Django admin 中的 JQuery 的问题。我尝试过类似的方法: $("#id_Switch").click( function() { alert("hello"); });但它不起作用。 FireBug 告诉我 $ 是未定义的。 HTML 代码如下所示:
        从我对JQuery的理解来看应该工作,但它没有。
      • 你也应该在你的页面中包含 jquery.js - 通过特定管理类的媒体,或者通过继承条目编辑模板并覆盖额外头(或类似的东西)块来全局
      【解决方案3】:

      我知道这是一种快捷方式,可能不是最佳选择,但您是否考虑过使用 optgroup 将两个选择小部件组合成一个小部件?它将使您免于编写自定义 javascript。

      因为它是一个外键,如果他们选择一个端口,你就知道开关是什么。您可以将开关设置为 optgroup,其值为“”,因此仅选择一个开关后它们就无法保存。以下是我可以看到的步骤:

      1. 自定义表单字段以省略switch
      2. port 表单字段的标题更改为Switch/Port
      3. port 表单字段的choices 更改为从交换机/端口生成的元组。
      4. 添加用于保存的自定义视图,该视图从端口获取开关并将用户的开关设置为该端口。

      如果用户/利益相关者认为这是可以接受的,这是一种绕过涉及大量 Django 编程的 JavaScript 编程的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        • 2016-09-03
        • 1970-01-01
        • 2012-07-23
        • 1970-01-01
        相关资源
        最近更新 更多