【发布时间】:2021-05-16 22:36:12
【问题描述】:
我在我的 Django webapp 上实现了一个依赖下拉列表。我使用了本教程Implementing dependent drop down。但是,当我想更新表单时,挑战就来了。为了正确理解这一点,让我在这里重新创建代码。
模型.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 表中知道品牌。
这是表格:
forms.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 代码下的表单最后一部分收到错误消息。我想使用model 的存储值获取make 的值,然后使用它来呈现表单,当然,选择model 的选项是来自所选make 的选项,除非用户现在使更改为 make 字段。
这是我迄今为止尝试过的(尤其是在forms.py 的elif 部分下),但我不断收到错误消息:TypeError: 'VehicleModel' object is not iterable。我做错了什么?
【问题讨论】:
标签: python django drop-down-menu