#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», но, по вашему мнению, вы ищете «категорию»