Фильтр выбора для поля "многие ко многим" в форме 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


        
Вернуться на верх