'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 |
