You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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作为选项

代码修正及优化

现有代码存在两处问题:

  1. 变量名不匹配:elif分支使用了未定义的jenis_transaksi,且判断值'keluar'与需求的'out'不符
  2. 未处理新建表单(无实例)或初始值为空的情况,会触发属性错误

修正后的代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:23:31