Выпадающий фильтр в формах django
В форме я пытаюсь отфильтровать выпадающее поле marketplace, принадлежащее вошедшему пользователю, на основе его группы. Он перечисляет все элементы выпадающего поля. Я пробовал ниже, но мне кажется, что что-то не так с частью фильтра.
class InfringementForm(ModelForm): def __init__(self, user, *args, **kwargs): super(InfringementForm,self).__init__(*args, **kwargs) self.fields['marketplace'].queryset = Marketplace.objects.filter(groups__user=self.user) class Meta: model = Infringement
class Meta: ordering = ['-updated', '-created'] def __str__(self): return self.name
fields = ['name', 'link', 'infringer', 'player', 'remove', 'status', 'screenshot','marketplace']
models.py
class Marketplace (models.Model): name = models.CharField(max_length=100) updated = models.DateTimeField(auto_now=True) created = models.DateTimeField(auto_now_add=True) groups = models.ForeignKey(Group, on_delete=models.CASCADE,default=1)
Попробуйте это внутри метода __init__()
:
def __init__(self, user, *args, **kwargs):
self.user = user
super(InfringementForm,self).__init__(*args, **kwargs)
self.fields['marketplace'].queryset = Marketplace.objects.filter(groups__user=self.user)
Окончательный ответ - добавление self.user = user в формах и добавление пользователя в представлении.
forms.py
class InfringementForm(ModelForm): def __init__(self, user, *args, **kwargs): self.user = user super(InfringementForm,self).__init__(*args, **kwargs) self.fields['marketplace'].queryset = Marketplace.objects.filter(groups__user=self.user) class Meta: model = Infringement fields = ['name', 'link', 'infringer', 'player', 'remove', 'status', 'screenshot', 'marketplace']
views.py
@login_required(login_url='login') def createInfringement(request): user=request.user form = InfringementForm(user=request.user) if request.method == 'POST': form = InfringementForm(user, request.POST, request.FILES) if form.is_valid(): form.save() return redirect('home') context ={'form': form} return render (request, 'base/infringement_form.html', context)
Попробуйте это решение...
В основном groups
является внешним ключом в Marketplace
модели, он возвращает полный объект Group
модели.
вы пытались фильтровать с помощью полного объекта, это невозможно в запросе, поэтому вы можете фильтровать с помощью id
экземпляра пользователя
Код становится таким
class InfringementForm(ModelForm):
def __init__(self, user, *args, **kwargs):
super(InfringementForm,self).__init__(*args, **kwargs)
self.fields['marketplace'].queryset =
Marketplace.objects.filter(groups__user__id=self.user.id)
class Meta:
model = Infringement