首页 > 解决方案 > django.core.exceptions.FieldError:无法将关键字“productcategory_id”解析为字段。选项有:国家、国家/地区 ID、ID、名称、供应商?

问题描述

我试图在这里使用 Django 依赖下拉列表。但与此同时,错误发生了。如果我发出 ajax 请求,请单击产品类别,并且依赖的下拉菜单不能一起工作并且无法发出 ajax 请求会显示错误。如何解决此错误?请有人帮我解决这个问题。

模型.py

 from django.db import models

 class ProductCategory(models.Model): 
     name = models.CharField(max_length=30)

     def __str__(self):
         return self.name

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

     def __str__(self):
        return self.name

 class Vendor(models.Model):
     designer_name = models.CharField(max_length=100, default='')
     design_name = models.CharField(max_length=200)
     description = models.TextField(max_length=5000)
     productcategory = models.ForeignKey(ProductCategory, on_delete=models.SET_NULL, 
     null=True)
     subcategory = models.ForeignKey(SubCategory, on_delete=models.SET_NULL, null=True)

     def __str__(self):
         return self.designer_name

表格.py

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

 class DesignerForm(forms.ModelForm):
     class Meta:
         model = Vendor
         descr = forms.CharField( widget=forms.Textarea )        
         fields = ('designer_name','design_name', 'description', 'productcategory', 'subcategory')

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'))
            self.fields['subcategory'].queryset = SubCategory.objects.filter(productcategory_id=productcategory_id).order_by('name')
        except (ValueError, TypeError):
            pass  # invalid input from the client; ignore and fallback to empty City queryset
    elif self.instance.pk:
        self.fields['subcategory'].queryset = self.instance.productcategory.subcategory_set.order_by('name')

视图.py

 from .models import *
 from django.shortcuts import render, redirect
 from .forms import *



 def Products(request):
     if request.method == 'POST':
         form = DesignerForm(request.POST)
         if form.is_valid():
             form.save()
         return redirect('Products')
    else:
         form = DesignerForm()
    return render(request, 'jinja2/products.jinja',{'form': form})



 def ajax_load_subcategories(request):
     productcategory_id = request.GET.get('productcategory')
     subcategories = 
    SubCategory.objects.filter(productcategory_id=productcategory_id).order_by('name')
      return render(request, 'jinja2/city_dropdown_list_options.jinja', {'subcategories': 
     subcategories})

管理员.py

 from django.contrib import admin
 from boutique_store.models import Vendor, ProductCategory, SubCategory


 # Register your models here.
 admin.site.register(ProductCategory)
 admin.site.register(SubCategory)
 admin.site.register(Vendor)

网址.py

 from django.urls import include, path
 from . import views

 urlpatterns = [

     path('add/', views.Products, name='Products'),
     path('ajax/load_subcategories/', views.ajax_load_subcategories, 
    name='ajax_load_subcategories'),  # <-- this one here
 ]

产品.jinja

 {% block content %}

   <h2>Person Form</h2>

   <form method="post" id="designerForm" data-subcategories-url="{% URL 
 'ajax_load_subcategories' %}" novalidate>
     {% csrf_token %}
    <table>
      {{ form.as_table }}
    </table>
     <button type="submit">Save</button>
  </form>

   <script src="https://code.jquery.com/jquery-3.6.0.min.js" 
 integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"> 
</script>
  <script>
    $("#id_productcategory").change(function () {
    var url = $("#designerForm").attr("data-subcategories-url");
     var productcategoryId = $(this).val();

      $.ajax({
        url: URL,
        data: {
          'productcategory': productcategoryId
        },
       success: function (data) {
         $("#id_subcategory").html(data);
       }
      });

     });
   </script>

{% endblock %}

city_dropdown_list_options.jinja

 <option value="">---------</option>
 {% for subcategory in subcategories %}
 <option value="{{ subcategory.pk }}">{{ subcategory.name }}</option>
 {% endfor %}

错误图像

标签: pythondjangoajaxdjango-modelsdjango-forms

解决方案


SubCategory模型中,您有一个名为的字段country,它引用ProductCategory. 您无法过滤,productcategory_id因为当前模型中没有这样的列/字段。

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

     def __str__(self):
        return self.name 

forms.py因此,请尝试在和中修复您的查询,如下所示views.py

SubCategory.objects.filter(country_id=productcategory_id).order_by('name')

推荐阅读