Weisen Sie der untergeordneten Vorlage im {% include%} -Tag Django Variablen zu

86

Ich habe diesen Code (der mir nicht das erwartete Ergebnis liefert)

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

untergeordnete Vorlage:

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

und meine Ansicht

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

Der obige Code erstellt HTML so, wie ich es möchte, jedoch aktualisiert das Formular die Datenbank nicht.

ABER,

Wenn ich die mittlere Vorlage überspringe und direkt zum Upload-Formular gehe, funktioniert es einwandfrei:

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

Helfen Sie mir bitte, damit es mit der mittleren Vorlage funktioniert. Ich möchte dies tun, weil ich denselben Code nicht mehr als einmal eingeben möchte.

Vor
quelle
13
Haben Sie versucht, das includemit zu verwenden with?
Besnik

Antworten:

213

Wie @Besnik vorgeschlagen hat, ist es ziemlich einfach:

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

In der Dokumentation wird diesinclude erwähnt. Es wird auch erwähnt, dass Sie onlydie Vorlage nur mit den angegebenen Variablen rendern können , ohne andere Variablen zu erben.

Vielen Dank, dass Sie @Besnik

Vor
quelle
4
Der Vollständigkeit halber ist zu beachten, dass Sie, wenn Sie die Vorlage nur mit den angegebenen Variablen rendern möchten (und den übergeordneten Kontext nicht erben), die Option "nur" hinzufügen können: {% include "path / to / template.html" mit form = Nur Formular}}
Gonz
8
Der Vollständigkeit halber
Timo
@Vor Wenn meine Ansicht zurückkehrt context["these_items"]und context["other_items"]kann ich mit diesem verwenden sind zu ersetzen {% for item in these_items %}mit {% for item in other_items %}?
GiannisIordanou
Aus irgendeinem Grund funktioniert es nicht, wenn die Variable ein _ im Namen hat. Beispiel: {% include "subject_file_upload.html" mit my_form = form foo = bar%}. Irgendeine Erklärung dafür?
Alan Tygel