Django表单外键筛选问题:按交易类型过滤Pallet选项
Django表单根据交易类型动态过滤Pallet选项
模型定义
class Transaction(models.Model): transaction_type = models.CharField(max_length=10, choices=transaction_type_CHOICES) palletnumber = models.ForeignKey(Pallet, on_delete=models.CASCADE) class Pallet(models.Model): nama_pallet = models.CharField(max_length=100, unique=True) pallet_weight = models.IntegerField() status = models.BooleanField(default=False)
现有表单初始化代码
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) transaction_type = self.initial.get('transaction_type') or self.instance.transaction_type if transaction_type == 'in': self.fields['palletnumber'].queryset = Pallet.objects.filter(status=False) elif jenis_transaksi == 'keluar': self.fields['palletnumber'].queryset = Pallet.objects.filter(status=True)
需求
- 交易类型为
in时,筛选status=False的Pallet作为选项 - 交易类型为
out时,筛选status=True的Pallet作为选项
代码修正及优化
现有代码存在两处问题:
- 变量名不匹配:
elif分支使用了未定义的jenis_transaksi,且判断值'keluar'与需求的'out'不符 - 未处理新建表单(无实例)或初始值为空的情况,会触发属性错误
修正后的代码:
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 安全获取交易类型:优先取初始值,有实例且已保存则取实例值 transaction_type = self.initial.get('transaction_type') if not transaction_type and hasattr(self, 'instance') and self.instance.pk: transaction_type = self.instance.transaction_type # 根据交易类型过滤Pallet选项 if transaction_type == 'in': self.fields['palletnumber'].queryset = Pallet.objects.filter(status=False) elif transaction_type == 'out': self.fields['palletnumber'].queryset = Pallet.objects.filter(status=True) else: # 未选择交易类型时,默认隐藏所有选项(可根据需求改为显示全部) self.fields['palletnumber'].queryset = Pallet.objects.none()
补充说明
如果需要在前端实时切换Pallet选项(比如用户选完交易类型后立即更新下拉列表),仅后端初始化过滤不够,还需配合JavaScript实现:
- 监听交易类型下拉框的
change事件 - 发送AJAX请求到后端接口,传入选中的交易类型
- 根据返回的Pallet数据更新
palletnumber下拉框的选项
内容的提问来源于stack exchange,提问作者Kelvin Valentino
相关产品推荐
相关产品推荐

