diff --git a/people/forms.py b/people/forms.py index 38561aa..80c6fad 100644 --- a/people/forms.py +++ b/people/forms.py @@ -49,10 +49,17 @@ class DynamicAnswerSetBase(forms.Form): super().__init__(*args, **kwargs) for question in self.question_model.objects.all(): - field = self.field_class(label=question, - queryset=question.answers, - widget=self.field_widget, - required=self.field_required) + field_class = self.field_class + field_widget = self.field_widget + + if question.is_multiple_choice: + field_class = forms.ModelMultipleChoiceField + field_widget = Select2MultipleWidget + + field = field_class(label=question, + queryset=question.answers, + widget=field_widget, + required=self.field_required) self.fields['question_{}'.format(question.pk)] = field @@ -92,7 +99,12 @@ class PersonAnswerSetForm(forms.ModelForm, DynamicAnswerSetBase): # Save answers to relationship questions for key, value in self.cleaned_data.items(): if key.startswith('question_') and value: - self.instance.question_answers.add(value) + try: + self.instance.question_answers.add(value) + + except TypeError: + # Value is a QuerySet - multiple choice question + self.instance.question_answers.add(*value.all()) return self.instance @@ -119,7 +131,12 @@ class RelationshipAnswerSetForm(forms.ModelForm, DynamicAnswerSetBase): # Save answers to relationship questions for key, value in self.cleaned_data.items(): if key.startswith('question_') and value: - self.instance.question_answers.add(value) + try: + self.instance.question_answers.add(value) + + except TypeError: + # Value is a QuerySet - multiple choice question + self.instance.question_answers.add(*value.all()) return self.instance diff --git a/people/migrations/0027_multiple_choice_questions.py b/people/migrations/0027_multiple_choice_questions.py new file mode 100644 index 0000000..c176787 --- /dev/null +++ b/people/migrations/0027_multiple_choice_questions.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.10 on 2020-12-07 16:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('people', '0026_move_static_person_questions'), + ] + + operations = [ + migrations.AddField( + model_name='personquestion', + name='is_multiple_choice', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='relationshipquestion', + name='is_multiple_choice', + field=models.BooleanField(default=False), + ), + ] diff --git a/people/models/question.py b/people/models/question.py index 700a4df..7379fb3 100644 --- a/people/models/question.py +++ b/people/models/question.py @@ -22,6 +22,11 @@ class Question(models.Model): #: Text of question text = models.CharField(max_length=255, blank=False, null=False) + #: Should people be able to select multiple responses to this question? + is_multiple_choice = models.BooleanField(default=False, + blank=False, + null=False) + #: Position of this question in the list order = models.SmallIntegerField(default=0, blank=False, null=False)