python - 在 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
:我究竟做错了什么?
解决方案
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 })
我希望它可以帮助遇到同样问题的任何人。
推荐阅读
- android - android动画中的XScale vs XDelta
- django - 如何解决 ImportError:没有名为 urls 的模块
- c# - PdfWriter.getverticalposition() 是否在 Itext 7 中停止?
- python - 无法连接到雪花
- docker - 使用 Istio sidecar 从多容器 pod 调用服务
- php - 注册和登录php的问题,你会检查我的代码吗?如果有错误
- php - 如何在文件上传期间禁用/阻止设备询问“拍照”选项
- ios - 在 tableview 中,如果选择第 1 行第 1 行,那么为什么还选择了第二部分第 1 行?
- bigcommerce - bigcommerce 单页结帐在结帐 sdk 中不起作用
- python - 测量数据框的负/正偏度