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
相关产品推荐
相关产品推荐

