【问题标题】:Loading extra fields for update in Django dependent dropdown list在 Django 相关下拉列表中加载额外字段以进行更新
【发布时间】: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.pyelif 部分下),但我不断收到错误消息:TypeError: 'VehicleModel' object is not iterable。我做错了什么?

【问题讨论】:

    标签: python django drop-down-menu


    【解决方案1】:

    我可以通过在 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 })
    

    希望对遇到同样问题的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 2019-04-15
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      相关资源
      最近更新 更多