Невозможно запросить отношения "многие ко многим" в Django
У меня есть Модель UserCategoryFilter
с M2M отношением к Модели Category
# View
@require_GET
def get_category_filter(request):
# Get the existing user instance if any
filter_instance = UserCategoryFilter.objects.get(user=request.user)
# Get the current selections/filters
selection = filter_instance.categories_selected
print(selection)
# Get the form instance and pre-populate it with initial choices
category_filter_form = SelectCategoryForm(initial={
'selection': selection,
})
# Create the context
context = {
'category_filter_form': category_filter_form
}
# Render the form instance as string for async DOM population
template = render_to_string('core/filter_form.html', context=context)
# Return the string to feed the ajax success function
return JsonResponse({"form": template})
Однако selection
всегда возвращает None
вместо кверисета, даже если есть три категории, выбранные пользователем и сохраненные в БД. А как сделать так, чтобы форма принимала начальные значения из selection
?
# Models
class Category(models.Model):
category = models.CharField(max_length=30)
category_color = models.CharField(max_length=15, blank=True)
def __str__(self):
return str(self.category)
class UserCategoryFilter(models.Model):
user = models.ForeignKey(Account, on_delete=models.CASCADE)
categories_selected = models.ManyToManyField(Category)
# Form
class SelectCategoryForm(forms.Form):
"""
A form to update category filters for logged in users
"""
choices = forms.ModelMultipleChoiceField(queryset=Category.objects.all().order_by('category'),
widget=forms.CheckboxSelectMultiple)
чтобы получить их, вы можете использовать .all().Попробуйте это
@require_GET
def get_category_filter(request):
# Get the existing user instance if any
filter_instance = UserCategoryFilter.objects.get(user=request.user)
# Get the current selections/filters
selection = filter_instance.categories_selected.all() #new
print(selection)
вы также можете сделать что-то вроде этого
@require_GET
def get_category_filter(request):
# Get the current selections/filters
selection = UserCategoryFilter.objects.filter(user=request.user).values_list('categories_selected') #new
print(selection)