django.ядро.исключения.FieldError: Не удается разрешить ключевое слово «productcategory_id» в поле. Варианты: страна, идентификатор страны, идентификатор, имя, поставщик?

#python #django #ajax #django-models #django-forms

Вопрос:

Я пытаюсь использовать здесь выпадающий список, зависящий от Django. Но в то же время произошла ошибка. Если я сделаю запрос ajax, щелкните категорию продукта, и в выпадающем списке «Зависимые», который не работает совместно и не может выполнить запрос ajax, появится ошибка. Как устранить эту ошибку? Пожалуйста, кто-нибудь может помочь мне разобраться в этой проблеме.

Models.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  

forms.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')  

Views.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})  

admin.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)  

urls.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'), # lt;-- this one here  ]  

products.jinja

 {% block content %}   lt;h2gt;Person Formlt;/h2gt;   lt;form method="post" id="designerForm" data-subcategories-url="{% URL   'ajax_load_subcategories' %}" novalidategt;  {% csrf_token %}  lt;tablegt;  {{ form.as_table }}  lt;/tablegt;  lt;button type="submit"gt;Savelt;/buttongt;  lt;/formgt;   lt;script src="https://code.jquery.com/jquery-3.6.0.min.js"   integrity="sha256-/xUj 3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"gt;  lt;/scriptgt;  lt;scriptgt;  $("#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);  }  });   });  lt;/scriptgt;  {% endblock %}  

city_dropdown_list_options.jinja

 lt;option value=""gt;---------lt;/optiongt;  {% for subcategory in subcategories %}  lt;option value="{{ subcategory.pk }}"gt;{{ subcategory.name }}lt;/optiongt;  {% endfor %}  

изображение с ошибкой

Ответ №1:

В 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')