2010-06-08 75 views
0

我有机型是这样的:预填充下拉框联系

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管理界面。只需为一个Field添加此功能即可。

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

回答

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 maniuplation应该是直截了当:要在onChange()事件保管箱的绑定到去除所有,但在港口的dropbox相关Ports的功能。

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

0

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

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

提示:使用Firebug或Chrome检查器调查窗体上HTML字段的真实姓名。

+0

谢谢你的评论。看起来像最简单的方法来实现我所需要的。 Django admin中只有一个关于JQuery的问题。我试过类似的东西: $(“#id_Switch”)。click(function(){ alert(“hello”); }); 但它不起作用。 FireBug告诉我$是未定义的。 HTML代码如下:

从我的JQuery的理解它应该工作但事实并非如此。 – onorua 2010-06-09 15:30:38

+1

你也应该在你的页面中包含jquery.js - 通过特定的管理员类的媒体,或者通过继承条目编辑模板并覆盖额外的元素(或类似的东西) – Guard 2010-06-10 07:10:24

0

我知道这是一个快捷方式,可能不是最优的,但是您是否考虑过使用optgroup将两个选择小部件组合成一个小部件?这将节省您编写自定义JavaScript。

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

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

如果用户/利益相关者会认为这是可以接受的,那么这是一种绕过JavaScript编程的方式,它涉及到一定程度的Django编程。