【发布时间】:2009-12-16 05:25:37
【问题描述】:
在admin中显示(model)表单时,如何设置字段(与表单相关,但不直接基于同一模型)的值?
这是我所拥有的简化版本(我的实际应用程序/模型/等更复杂):
- 一个
building有很多rooms - 一个
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
添加或编辑一件设备时,最好能够限制room 的选择(通过构建)。我可以这样做:我将building 字段添加到ModelForm,然后当它被用户更改时,模板文件中的一些JQuery 会动态更新rooms 的列表。 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)
添加新的equipment 时,一切正常——我的JQuery 代码显示-----,直到选择了一个建筑物,此时room 字段的下拉列表被启用并填充适合该建筑物的rooms。
问题是:在显示现有设备 (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 访问数据库来显示图形值,因为它似乎是在呈现表单时应该做的事情......
有什么想法吗?谢谢你的帮助!
【问题讨论】:
标签: django field django-forms