当在管理界面中显示一个(模型)表单时,如何设置与表单相关但不直接基于同一模型的字段的值?以下是我所拥有的简化版本(实际应用/模型等更为复杂):
building
拥有许多room
room
拥有许多equipment
模型:
#spaces/models.py
from django.db import models
class Building(models.Model):
name=models.CharField(max_length=32)
def __unicode__(self):
return self.name
class Room(models.Model):
number=models.CharField(max_length=8)
building=models.ForeignKey(Building)
def __unicode__(self):
return self.number
class Equipment(models.Model):
tech = models.CharField(max_length=64)
room = models.ForeignKey(Room)
def __unicode__(self):
return self.tech
在添加或编辑设备时,如果能够通过建筑物来限制选择的“房间”选项,将会很方便。 我可以这样做:我向ModelForm添加一个“建筑物”字段,然后当用户更改它时,模板文件中的一些JQuery代码动态更新“房间”的列表。 “admin.py”部分如下:
#spaces/admin.py
from demo.spaces.models import Building, Room, Equipment
from django.contrib import admin
from django import forms
class EquipmentForm(forms.ModelForm):
class Meta:
model = Equipment
building = forms.ModelChoiceField(Building.objects)
class EquipmentAdmin(admin.ModelAdmin):
form = EquipmentForm
admin.site.register(Equipment, EquipmentAdmin)
admin.site.register(Building)
admin.site.register(Room)
当添加新的
设备
时,这一切都很顺利——我的JQuery代码显示-----
,直到选择建筑物,此时room
字段的下拉菜单将启用并填充适用于该建筑物的相应room
s。
问题在于:当显示现有的设备(demo.com/admin/spaces/equipment/12/
)或者添加表单未通过验证时,Room
字段会正确显示room
,但是building
字段被清空了。虽然equipment.room
外键值存在于表单实例中,管理员会自动处理设置room
字段的值,但是我需要自己设置building
字段的值。我可以轻松地获取这个值,因为在表单的init中检查它是否为实例,然后向上遍历以获取该值非常容易。
def __init__(self, *args, **kwargs):
super(EquipmentForm, self).__init__(*args, **kwargs)
if 'instance' in kwargs:
building_value = kwargs['instance'].room.building
但是我该如何使用这个值来使字段显示它呢?我尝试的唯一一件事就是在我的模板中添加更多的代码,使用Jquery获取该值并在最后设置它,但我不想让JavaScript在页面上访问数据库来显示该值,因为这似乎应该在渲染表单时完成...
有什么想法吗?感谢您的帮助!