Asignar variables a la plantilla secundaria en la etiqueta {% include%} de Django

89

Tengo este código (que no me da el resultado esperado)

#subject_content.html
{% block main-menu %}
    {% include "subject_base.html" %}
{% endblock %}


#subject_base.html
....
....
    <div id="homework" class="tab-section">
        <h2>Homework</h2>
            {% include "subject_file_upload.html" %}
    </div>

plantilla hijo:

#subject_file_upload.html
    <form action="." method="post" enctype="multipart/form-data">{% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="submit">
    </form>

y mi vista

#views.py
@login_required
def subject(request,username, subject):
    if request.method == "POST":
        form = CarsForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect("/")
    form = CarsForm()
    return render_to_response('subject_content.html', {'form':form}, context_instance=RequestContext(request))

El código anterior crea HTML de la manera que quiero que sea, sin embargo, el formulario no actualiza la base de datos.

PERO,

Si me salto la plantilla del medio y voy directamente al formulario de carga, funciona bien:

#subject_content.html
{% block main-menu %}
    {% include "subject_file_upload.html" %}
{% endblock %}

Ayúdame por favor para que funcione con la plantilla intermedia. Quiero hacer esto porque no quiero escribir el mismo código más de una vez.

Vor
fuente
13
¿Has intentado usar el includecon with?
Besnik

Respuestas:

215

Como sugirió @Besnik, es bastante simple:

{% include "subject_file_upload.html" with form=form foo=bar %}

La documentación para loinclude menciona. También menciona que puede usar onlypara representar la plantilla solo con las variables dadas, sin heredar ninguna otra variable.

Gracias @Besnik

Vor
fuente
4
Para completar, tenga en cuenta que si desea representar la plantilla solo con las variables dadas (y no hereda el contexto principal), puede agregar la opción "solo": {% include "path / to / template.html" con form = solo formulario}}
gonz
8
Para completar de nuevo, aquí está el enlace a "con": docs.djangoproject.com/en/1.8/ref/templates/builtins/#include
Timo
Si mis @Vor vista vuelve context["these_items"]y context["other_items"], puedo usar incluyen con este sustituir {% for item in these_items %}con {% for item in other_items %}?
GiannisIordanou
por alguna razón, si la variable tiene un _ en su nombre, no funciona. Ejemplo: {% incluyen "subject_file_upload.html" con my_form = form foo = bar%}. ¿Alguna explicación para esto?
Alan Tygel