Фильтр выбора для поля "многие ко многим" в форме django
Я хочу, чтобы "picking_person" можно было выбрать только из "членов" группы. Я пробую некоторые init и фильтры, но не могу найти решение. Модель профиля не связана с моделью группы. Модель группы имеет два атрибута, которые связаны с профилем:
class Group(models.Model):
members = models.ManyToManyField(
Profile, blank=True, default=Profile, related_name="members"
)
picking_person = models.ManyToManyField(
Profile, blank=True, default=Profile, related_name="picking_person"
)
forms.py:
class ChoosePersonPickingForm(ModelForm):
class Meta:
model = Group
fields = ['picking_person']
views.py:
def choose_person_to_pick_players(request, pk):
group = Group.objects.get(id=pk)
form = ChoosePersonPickingForm(instance=group)
group_members = group.members.all()
if request.method == "POST":
form = ChoosePersonPickingForm(request.POST, instance=group)
form.save()
return redirect('group', group.id)
context = {'form': form}
return render(request, "choose-picking-person.html", context)
Можете ли вы помочь мне найти решение?
Просто в качестве отступления - вы уверены, что хотите, чтобы Picking Person был ManyToMany, есть ли больше одного в группе?
Как бы то ни было - поскольку список выбираемых персон может быть разным для каждой формы, вы хотите использовать функцию init в вашей форме для генерации опций, поскольку она вызывается при инстанцировании формы. Вы можете использовать экземпляр, который вы уже передаете, чтобы помочь с набором запросов. Очевидно, что это будет работать только для существующей группы.
class ChoosePersonPickingForm(ModelForm):
picking_person_choices= None
picking_person = forms.ModelMultipleChoiceField(label='Pick Person', queryset=picking_person_choices, required=True)
#could be a ModelChoiceField if picking_person not actually ManyToMany
class Meta:
model = Group
fields = ['picking_person']
def __init__(self, *args, **kwargs):
super(ChoosePersonPickingForm, self).__init__(*args, **kwargs)
self.picking_people_choices= Profile.objects.filter(members = self.instance)
self.fields['picking_person'].queryset = self.pick_people_choices