我有模型
class Event(models.Model):
name = models.CharField(max_length = 50)
class DriverClass(models.Model):
name = models.CharField(max_length = 20)
event = models.ForeignKey(Event)
class Driver(models.Model):
name = models.CharField(max_length = 50)
event = models.ForeignKey(Event)
driverclass = models.ForeignKey(DriverClass)
一个事件应该有一定数量的
DriverClass
es 供 Driver
选择。现在的问题是 Driver
只连接到 DriverClass
和 Event
,所以当我为 DriverClass
中的驱动程序选择 django admin
时,我可以从所有 DriverClass
es 中进行选择。我不确定是否可以在模型中更改某些内容以完成我想要的操作,或者我是否只需更改 Driver
s ModelAdmin
类以便仅显示正确的事件。正确的程序是什么? 最佳答案
您应该指定一个自定义 ModelForm
来更改 driverclass 字段的查询集并将其添加到您的 ModelAdmin
:
class DriverForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(DriverForm, self).__init__(*args, **kwargs)
if self.instance.event:
# this form has an event specified in either instance, initial or data
self.fields['driverclass'].queryset = DriverClass.objects.filter(event=self.instance.event)
class DriverAdmin(admin.ModelAdmin):
form = DriverForm
一个警告是,当您更改
Event
时,您的 DriverClass
选项在您提交表单之前不会更新。该表单将抛出一个 ValidationError,并且返回的表单将有正确的选择。更改此行为需要 Ajax 请求并通过 Javascript 进行动态更新。关于Django 模型关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17767413/