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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.