from django import forms from django.core.exceptions import ValidationError from character.models import Character from party.models import Party class PartyForm(forms.ModelForm): def __init__(self, *args, **kwargs): self.original_instance = kwargs.get("instance") super().__init__(*args, **kwargs) qs = Character.objects.filter(private=False) if self.original_instance: qs = qs.union(self.original_instance.invited_characters.all()) self.fields["invited_characters"].queryset = qs class Meta: model = Party fields = ["name", "invited_characters"] def clean_invited_characters(self): invited = self.cleaned_data["invited_characters"] if not self.original_instance: return invited members = self.original_instance.characters.all() for character in invited: if character in members: self.add_error( "invited_characters", ValidationError(f"{character} is already a group member."), ) return invited