es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Django – Dividiendo un modelform en secciones

Estoy creando una aplicación de administración de propiedades donde el usuario puede completar una solicitud de alquiler. Estoy buscando una manera de dividir mi formulario en secciones como

Información personal:
ítem
ítem
ítem
ítem
Historial de alquiler:
ítem
ítem
ítem
ítem
Empleo:
ítem
ítem
ítem

Mi formulario

class ApplicantForm(forms.ModelForm):
    def <strong>init</strong>(self, <em>args, *</em>kwargs):
        super(ApplicantForm, self).<strong>init</strong>(<em>args, *</em>kwargs)
        self.fields['property'].queryset = Properties.objects.filter(is_active=True)

<pre><code>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': 'Fecha de mudanza solicitada',
        'dob': 'Fecha de nacimiento',
        'ssn':  'Número de Seguro Social',
        'job_length': 'Fecha de inicio de trabajo'
    }
</code></pre>

Mi plantilla

```{% extends 'base/base.html' %}
{% load crispy<em>forms</em>tags %}
{% block content %}
    <div class="jumbotron text-center">
        Página de solicitud
    </div>

<pre><code>&lt;form class=&quot;post-form&quot; method=&quot;POST&quot;&gt;
    {% csrf_token %}
    {{ form|crispy }}
    &lt;button type=&quot;submit&quot; class=&quot;save btn btn-primary&quot;&gt;Enviar&lt;/button&gt;
&lt;/form&gt;
</code></pre>

{% endblock %}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para dividir el formulario en secciones, se pueden utilizar los fieldsets de Django. En la clase del formulario, incluye el atributo fieldsets y define las secciones como tuplas. Aquí tienes un ejemplo:

    “`{python}
    class ApplicantForm(forms.ModelForm):
    # mismo código que antes

    fieldsets = (
        ('Información Personal', {
            'fields': (
                'first_name',
                'last_name',
                'email',
                'phone_number',
                'dob',
                'ssn',
            ),
        }),
        ('Historial de Alquiler', {
            'fields': (
                'current_address',
                'current_landlord_name',
                'current_landlord_phone',
                'previous_address',
                'previous_landlord_name',
                'previous_landlord_phone',
            ),
        }),
        ('Empleo', {
            'fields': (
                'job_title',
                'job_employer',
                'job_supervisor',
                'job_phone',
                'job_length',
                'job_income',
                'job_other_income',
            ),
        }),
    )
    

    En tu plantilla, debes recorrer las secciones y sus campos con el método `get_section()`. Aquí tienes un ejemplo de una plantilla así: ```{python} {% extends 'base/base.html' %} {% load crispy_forms_tags %} {% block content %} <div class="jumbotron text-center"> Página de solicitud </div> <form class="post-form" method="POST"> {% csrf_token %} {% for section in form %} {% for field in section %} {% if field.name != 'csrfmiddlewaretoken' %} {% if field.is_hidden %} {{ field }} {% else %} <div class="form-group"> {{ field.label_tag }} {{ field }} </div> {% endif %} {% endif %} {% endfor %} {% endfor %} <button type="submit" class="save btn btn-primary">Enviar</button> </form> {% endblock %}

    Esto debería producir el resultado deseado de dividir el formulario en secciones.

Comments are closed.