首页 > 解决方案 > 在 Django 相关下拉列表中加载额外字段以进行更新

问题描述

我在我的 Django webapp 上实现了一个依赖下拉列表。我使用了本教程实现依赖下拉。但是,当我想更新表单时,挑战就来了。为了正确看待这一点,让我在这里重新创建代码。

模型.py

class VehicleMake(models.Model):
    make = models.CharField(max_length=20)
    manufacturer = models.CharField(max_length=20)

    def __str__(self):
        return self.make


class VehicleModel(models.Model):
    make = models.ForeignKey(VehicleMake, on_delete=models.CASCADE)
    model_name = models.CharField(max_length=20)

    def __str__(self):
        return self.model_name

class Vehicle(models.Model):
    model = models.ForeignKey(VehicleModel, on_delete=models.CASCADE)
    description = models.TextField()

请注意,与提供的教程不同,我没有车辆模型上的两个依赖字段。那是为了避免重复,因为如果您知道车辆型号,您肯定会从VehicleModel表格中知道品牌。

这是表格:

表格.py

class VehicleDetails(forms.ModelForm):
    make = forms.ModelChoiceField(queryset=VehicleMake.objects.all(),
                                    empty_label="Select Vehicle Make")
    class Meta:
        model = Vehicle
        fields = ['make', 'model', 'description'
        ]

    def __init__(self, *args, **kwargs):

        super(VehicleDetails, self).__init__(*args, **kwargs)

        self.fields['model'].queryset = VehicleModel.objects.none()

        if 'make' in self.data:
            try:
                make = int(self.data.get('make'))
                self.fields['model'].queryset = VehicleModel.objects.filter(make=make).order_by('model_name')
            except (ValueError, TypeError):
                pass  # invalid input from the client; ignore and fallback to empty VehicleModel queryset
        elif self.instance.pk:
            vehicle_model = VehicleModel.objects.get(self.instance.model)
            self.fields['make'] = vehicle_model.make
            self.fields['model'].queryset = self.instance.model_set.filter(make=vehicle_model.make).order_by('model_name')

所以,我的挑战是,当我想更新表单时,我从elif代码下表单的最后一部分收到错误。我想获得make使用 store 值的值,model然后使用它来呈现表单,当然,选择的选项model是 selected中的选项,除非用户现在对该字段make进行更改。make

这是我迄今为止尝试过的(尤其是在 的elif部分下forms.py),但我不断收到错误TypeError: 'VehicleModel' object is not iterable:我究竟做错了什么?

标签: pythondjangodrop-down-menu

解决方案


elif我能够通过在块中更改它来解决这个问题:

vehicle_model = VehicleModel.objects.get(pk=self.instance.model.id)
self.fields['make'].queryset = self.instance.model.make.__class__.objects.all()
self.fields['model'].queryset = self.instance.model.__class__.objects.filter(make=vehicle_model.make).order_by('model_name')

然后我要做的views.py就是确保加载当前值是initial在加载表单时添加一个值,即

vehicle_form = VehicleDetails(instance=listing.vehicle, initial = {'make': listing.vehicle.model.make })

我希望它可以帮助遇到同样问题的任何人。


推荐阅读