Search code examples
djangodjango-crispy-formsoptgroup

Django Crispy Forms and Option Groups


I've been searching around on the Crispy Forms documentation as well as general web searching for an answer to this.

Can Crispy Forms output <optgroup>'s within a ChoiceField using the forms.Select widget? Or must I take the data into the context and build the form out the old fashioned way in the template?

Thanks!


Solution

  • USER_GENERATED_TEMPLATES = MessageTemplate.objects.filter(Q(client=client_id) | Q(client=None) & Q(user_generated=True))
    DEFAULT_TEMPLATES = MessageTemplate.objects.filter(Q(client=client_id) | Q(client=None) & Q(user_generated=False))
    
    # Set the initial TEMPLATE CHOICES list to include the Default Templates choice object
    TEMPLATE_CHOICES = [('Default Templates',([[template.id, template.name] for template in DEFAULT_TEMPLATES]))]
    
    # If there are user generated templates, append the TEMPLATE_CHOICES list to include them
    if USER_GENERATED_TEMPLATES.count() > 0:
        TEMPLATE_CHOICES.append(('Saved Templates',([[template.id, template.name] for template in USER_GENERATED_TEMPLATES])))
    
    # Set the 'template' form field to a ChoiceField using the Select widget populated by the TEMPLATE_CHOICES list.
    self.fields['template'] = forms.ChoiceField(widget = forms.Select(), choices=TEMPLATE_CHOICES)