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

Django级联下拉报Cannot resolve keyword 'productcategory_id'错误如何解决

报错根源

你在查询SubCategory表时使用的字段名和模型实际定义不匹配:
你的SubCategory模型中关联ProductCategory的外键字段命名为country,Django自动生成的外键ID字段为country_id,你代码中所有使用productcategory_id作为SubCategory过滤条件的语句都存在字段名错误。同时还存在几处语法错误需要同步修复。

具体修复步骤

1. 修复forms.py代码

首先修正__init__方法的缩进错误(当前缩进层级不对,不在DesignerForm类内部),然后修改过滤字段名:

from django import forms
from .models import Vendor, ProductCategory, SubCategory

class DesignerForm(forms.ModelForm):
    class Meta:
        model = Vendor
        fields = ('designer_name','design_name', 'description', 'productcategory', 'subcategory')
        widgets = {
            'description': forms.Textarea,
        }

    # 缩进修正,放在类内部
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['subcategory'].queryset = SubCategory.objects.none()

        if 'productcategory' in self.data:
            try:
                productcategory_id = int(self.data.get('productcategory'))
                # 过滤字段从productcategory_id改为country_id
                self.fields['subcategory'].queryset = SubCategory.objects.filter(country_id=productcategory_id).order_by('name')
            except (ValueError, TypeError):
                pass
        elif self.instance.pk:
            self.fields['subcategory'].queryset = self.instance.productcategory.subcategory_set.order_by('name')

2. 修复views.py代码

修改ajax_load_subcategories视图中的过滤字段:

def ajax_load_subcategories(request):
    productcategory_id = request.GET.get('productcategory')
    # 过滤字段从productcategory_id改为country_id
    subcategories = SubCategory.objects.filter(country_id=productcategory_id).order_by('name')
    return render(request, 'jinja2/city_dropdown_list_options.jinja', {'subcategories': subcategories})

3. 修复products.jinja的代码

  • 模板标签{% URL改为小写{% url,Django模板标签大小写敏感
  • JS代码中变量名大小写不匹配,将AJAX参数里的大写URL改为小写url:
$("#id_productcategory").change(function () {
    var url = $("#designerForm").attr("data-subcategories-url");
    var productcategoryId = $(this).val();

    $.ajax({
        url: url, // 大写URL改为小写url
        data: {
            'productcategory': productcategoryId
        },
        success: function (data) {
            $("#id_subcategory").html(data);
        }
    });
});

可选优化建议

SubCategory模型里的外键字段命名为country语义和实际关联的ProductCategory不符,你可以直接修改字段名为productcategory,后续维护更清晰:

class SubCategory(models.Model):
    productcategory = models.ForeignKey(ProductCategory, on_delete=models.CASCADE)
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name

修改后执行python manage.py makemigrations和python manage.py migrate更新数据库结构即可,不需要再修改上面的过滤字段名。

内容的提问来源于stack exchange,提问作者Yabesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:54:03