根据Django Admin中的另一个下拉框选项预先填充dropbox

时间:2010-06-08 19:40:36

标签: jquery python django

我有这样的模特:

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") 

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

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

3 个答案:

答案 0 :(得分:1)

你是正确的,你需要一些j来创建它。您不需要重新编写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 maniuplation应该是直截了当的:您希望将保管箱的onChange()事件绑定到一个除去端口保管箱中相关Ports以外的所有功能的功能。

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我知道这是一个快捷方式,可能不是最优的,但您是否考虑过使用optgroup将两个选择的小部件合并为一个小部件?它可以帮助您免于编写自定义JavaScript。

因为它是一个ForeignKey,如果他们选择了一个端口,你就知道它是什么。您可以将开关设置为optgroups,值为“”,这样在选择一个开关后它们就无法保存。以下是我可以看到的步骤:

  1. 自定义表单字段以省略switch
  2. port表单字段的标题更改为 Switch / Port
  3. choices表单字段的port更改为从交换机/端口生成的元组。
  4. 添加自定义视图以便从端口获取切换,并将用户的开关设置为该端口。
  5. 如果用户/利益相关者认为这是可以接受的,那么这是一种绕过JavaScript编程的方法,它涉及一些Django编程。