Mwheeler91
Mwheeler91

Reputation: 275

Django - Dividing a modelform into sections

I am making a property management app where the user can fill out a rental application. I'm looking for a way to divide my form into sections like

Personal Information: item item item item Rental History: item item item item Employment item item item

My form

class ApplicantForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ApplicantForm, self).__init__(*args, **kwargs)
        self.fields['property'].queryset = Properties.objects.filter(is_active=True)

    class Meta:
        model = Applicant
        fields = '__all__'
        exclude = ['application_date']
        widgets = {
            'requested_move_in_date': DateInput(),
            'dob': DateInput(),
            'job_length': DateInput(),

        }
        labels = {
            'requested_move_in_date': 'Requested Move in Date',
            'dob': 'Date of Birth',
            'ssn':  "Social Security Number",
            'job_length': "Job Start Date"
        }

My template

{% load crispy_forms_tags %}
{% block content %}
    <div class="jumbotron text-center">
        Application page
    </div>

    <form class="post-form" method="POST">
        {% csrf_token %}
        {{ form|crispy }}
        <button type="submit" class="save btn btn-primary">Submit</button>
    </form>
{% endblock %}

Upvotes: 1

Views: 982

Answers (1)

Oleksii Tambovtsev
Oleksii Tambovtsev

Reputation: 2834

You can use FormHelper() from django-crispy-forms to override your form's layout. This is just an example, but you can change it for your purposes to make sections:

from crispy_forms.helper import FormHelper

class ApplicantForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()

        self.helper.layout = Layout(
            Row(
                Div('requested_move_in_date', css_class='col-12 col-md-4'),
                Div('dob', css_class='col-12 col-md-4'),
                Div('job_length', css_class='col-12 col-md-4'),
            ),
            ButtonHolder(
                Submit('submit', 'Сохранить'), css_class='form-btn-holder'
            )
        )

        super(ApplicantForm, self).__init__(*args, **kwargs)
        self.fields['property'].queryset = Properties.objects.filter(is_active=True)

    class Meta:
        model = Applicant
        fields = '__all__'
        exclude = ['application_date']
        widgets = {
            'requested_move_in_date': DateInput(),
            'dob': DateInput(),
            'job_length': DateInput(),

        }
        labels = {
            'requested_move_in_date': 'Requested Move in Date',
            'dob': 'Date of Birth',
            'ssn':  "Social Security Number",
            'job_length': "Job Start Date"
        }

Upvotes: 1

Related Questions