我有这样的模特:
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管理界面。只需为一个字段添加此功能。
你能帮我解决一下我的问题吗?谢谢。
答案 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,值为“”,这样在选择一个开关后它们就无法保存。以下是我可以看到的步骤:
switch
。port
表单字段的标题更改为 Switch / Port 。choices
表单字段的port
更改为从交换机/端口生成的元组。如果用户/利益相关者认为这是可以接受的,那么这是一种绕过JavaScript编程的方法,它涉及一些Django编程。