'Django Crispy Forms Layout Not Working Inside forms.Modelform

I've gotten CrispyForms to load a custom layout when using a form inside the generic CreateView, as shown below:

class editEvent(UpdateView):
    model = Event
    fields = [field.name for field in model._meta.fields if field.name not in 'organization']
    template_name = 'event_edit_modal.html'

    def get_success_url(self):
        org = self.request.user.profile.organization.url_name
        messages.success(self.request, 'Success: event updated.')
        return reverse('manage', kwargs={'org_name':org})

    def get_form(self):
        form = super().get_form()
        form.fields['location'].queryset = Location.objects.filter(organization=Organization.objects.get(url_name=self.request.user.profile.organization.url_name))
        form.fields['event_group'].queryset = EventGroup.objects.filter(organization=Organization.objects.get(url_name=self.request.user.profile.organization.url_name))
        form.fields['register_start'].widget = DateTimePickerInput()
        form.fields['register_end'].widget = DateTimePickerInput()
        form.fields['start'].widget = DateTimePickerInput()
        form.fields['end'].widget = DateTimePickerInput()
        form.helper = FormHelper()
        form.helper.add_input(Submit('submit', 'Update', css_class='btn-primary'))
        form.helper.layout = Layout(
            Row(
                Column('name', css_class='col-8'),
                Column('event_group', css_class='col-4'),
            ),
            'location',
            Row(
                Column('start'),
                Column('end'),
            ),
            Row(
                Column('register_start'),
                Column('register_end'),
            ),
            'details',
            'team_event',
            Row(
                Column('min_team_members'),
                Column('max_team_members'),
            ),
        )
        return form

However, inside a different form I'm needing to render the CrispyForms layout inside a forms.Modelform. However, for some reason the layout is being loaded. The help_texts, loaded by Django are loading, but the FormHelper layout is not:

class organizationForm(forms.ModelForm):
    allowed_email_domains = forms.CharField(max_length=40)
    owner_email = forms.EmailField(max_length=254)
    owner_first_name = forms.CharField(max_length=60)
    owner_last_name = forms.CharField(max_length=60)
    owner_password = forms.CharField(widget=forms.PasswordInput())
    confirm_owner_password = forms.CharField(widget=forms.PasswordInput())

    class Meta:
        model = Organization
        fields = ['name', 'url_name', 'about_text']
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['allowed_email_domains'].help_text = 'Optionally restrict users joining your organization to certain email domains. Example input: college.edu (do not include @ symbol)'
        self.fields['owner_email'].help_text = 'Email address for the owner of your organization. This user will be given all administrator rights.'
        self.helper = FormHelper()
        self.helper.layout = Layout(
            Row(
                Column('name'),
                Column('url_name'),
            )
        )

Below is my template used:

{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<form method='post' class='mt-5'>
    {% csrf_token %}
    {{ form|crispy }}
</form>
{% endblock %}

Am I doing something horribly wrong inside my forms.Modelform?



Solution 1:[1]

The problem is that you need to call crispy in a different way when using layout:

{% load crispy_forms_tags %}
{% block content %}
<form method='post' class='mt-5'>
    {% csrf_token %}
    {% crispy form }
</form>
{% endblock %}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Marti Markov