我有模型

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 只连接到 DriverClassEvent ,所以当我为 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/

10-10 06:43