Как Ajax может работать с динамическим раскрывающимся списком Django? не выбирает каждую подкатегорию в выбранной категории

#python-3.x #django #django-views #django-forms #django-templates

Вопрос:

не выбирает каждую подкатегорию в выбранной категории. Я покажу вам примеры из моих кодов, мои модели следующие:

 class Category(TranslatableModel):
    translation = TranslatedFields(
        name=models.CharField(max_length=255, blank=True, null=True, verbose_name=_('Name'))
    )
    slug = models.SlugField(max_length=255, unique=True, blank=True, null=True)

class Subcategory(TranslatableModel):
    translation = TranslatedFields(
        name=models.CharField(max_length=255, blank=True, null=True, verbose_name=_('Name'))
    )
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    slug = models.SlugField(max_length=255, unique=True, blank=True, null=True)

class Announcement(TranslatableModel):
    translations = TranslatedFields(
        title=models.CharField(max_length=255, verbose_name=_('Sarlavha')),
        description=models.TextField(verbose_name=_('Tavsif')))
    slug = models.SlugField(max_length=255, unique=True)
    created_at = models.DateTimeField(auto_now_add=True, )
    image = models.ImageField(upload_to='elonimages')
    category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, blank=True)
    subcategory = models.ForeignKey(Subcategory, on_delete=models.CASCADE, null=True, blank=True)
    is_public = models.BooleanField(default=False)
    full_name = models.CharField(max_length=50)
    address = models.CharField(max_length=250)
    phone = models.CharField(max_length=12)
    cost = models.CharField(max_length=9, blank=True, null=True)
 

Мой views.py файл выглядит следующим образом:

     class AnnouncementCreateView(CreateView):
      model = Announcement
      form_class = AnnouncementForm
      template_name = "announcement/add.html"
      success_url = reverse_lazy('announcement_list')

    def load_category(request):
      category_id = request.GET.get('category')
      subcategory = Subcategory.objects.filter(category_id=category_id).order_by('name')
      return render(request, "announcement/category_dropdown.html", {'subcategory': subcategory})
 

Мой forms.py файл выглядит следующим образом:

 class AnnouncementForm(TranslatableModelForm):
    class Meta:
        model = Announcement
        fields = ('title', 'description', 'image', 'category', 'subcategory', 'cost', 'full_name', 'address', 'phone',)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['subcategory'].queryset = Subcategory.objects.none()

        if 'category' in self.data:
            try:
                category_id = int(self.data.get('category'))
                self.fields['category'].queryset = Subcategory.objects.filter(category_id=category_id).order_by('name')
            except (ValueError, TypeError):
                pass
        elif self.instance.pk:
            self.fields['subcategory'].queryset = self.instance.subcategory_set.order_by('name')
 

Мой index.html файл выглядит следующим образом, и запрос ajax внизу:

  <form action="" method="post" id="announcementsForm" data-cities-url="{% url 'ajax_load_subcategory' %}"
              novalidate>
            {% csrf_token %}
{% forms.as_p%}
</form>
 

ajax-запрос:

 <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script>
    $("#id_category").change(function () {
        var url = $("#announcementsForm").attr("data-cities-url");
        var categoryId = $(this).val();
        $.ajax({
            url: url,
            data: {
                'category_id': categoryId
            },
            success: function (data) {
                $("#id_subcategory").html(data);
            }
        });
    });
</script>
 

category_dropdown.html файл:

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

вы можете понять мой проект, посмотрев на эту фотографию:
введите описание изображения здесь

Комментарии:

1. В вашем JS вы передаете «category_id», но, по вашему мнению, вы ищете «категорию»