Przypisz zmienne do szablonu podrzędnego w tagu {% include%} Django

89

Mam ten kod (który nie daje oczekiwanego wyniku)

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

szablon podrzędny:

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

i mój pogląd

#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))

Powyższy kod tworzy HTML tak, jak chcę, jednak formularz nie aktualizuje bazy danych.

ALE,

Jeśli pominę środkowy szablon i przejdę bezpośrednio do formularza przesyłania, wszystko działa dobrze:

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

Pomóż mi, proszę, aby działało ze środkowym szablonem. Chcę to zrobić, ponieważ nie chcę wpisywać tego samego kodu więcej niż raz.

Vor
źródło
13
Czy próbowałeś użyć includewith with?
Besnik

Odpowiedzi:

215

Jak zasugerował @Besnik, jest to całkiem proste:

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

Dokumentacjainclude wspomina o tym. Wspomina również, że można użyć onlydo renderowania szablonu tylko z podanymi zmiennymi, bez dziedziczenia innych zmiennych.

Dziękuję @Besnik

Vor
źródło
4
Dla kompletności zwróć uwagę, że jeśli chcesz wyrenderować szablon tylko z podanymi zmiennymi (i nie dziedziczy kontekstu nadrzędnego), możesz dodać opcję „tylko”: {% include „path / to / template.html” z form = tylko formularz}}
gonz
8
Dla kompletności ponownie, oto link do „with”: docs.djangoproject.com/en/1.8/ref/templates/builtins/#include
Timo,
@Vor Jeśli mój widok powróci context["these_items"]i context["other_items"], czy mogę użyć dołączenia do tego, aby zastąpić {% for item in these_items %}go {% for item in other_items %}?
GiannisIordanou
z jakiegoś powodu, jeśli zmienna ma w nazwie _, to nie działa. Przykład: {% include "subject_file_upload.html" with my_form = form foo = bar%}. Jakieś wyjaśnienie?
Alan Tygel