Tetapkan variabel ke templat anak dalam tag {% include%} Django

91

Saya memiliki kode ini (yang tidak memberi saya hasil yang diharapkan)

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

template anak:

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

dan pandangan saya

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

Kode di atas membuat HTML seperti yang saya inginkan, namun formulir tidak memperbarui database.

TAPI,

Jika saya melewatkan template tengah dan langsung membuka formulir pengunggahan, itu berfungsi dengan baik:

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

Tolong bantu saya untuk membuatnya bekerja dengan template tengah. Saya ingin melakukan ini, karena saya tidak ingin mengetik kode yang sama lebih dari sekali.

Vor
sumber
13
Sudahkah Anda mencoba menggunakan includedengan with?
Besnik

Jawaban:

220

Seperti yang disarankan @Besnik, ini sangat sederhana:

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

The dokumentasi untukinclude menyebutkan ini. Itu juga menyebutkan bahwa Anda dapat menggunakan onlyuntuk merender template dengan variabel yang diberikan saja, tanpa mewarisi variabel lain.

Terima kasih @Besnik

Vor
sumber
4
Untuk kelengkapan, perhatikan bahwa jika Anda ingin merender template hanya dengan variabel tertentu (dan tidak mewarisi konteks induk), Anda dapat menambahkan opsi "hanya": {% include "path / to / template.html" dengan form = formulir saja}}
gonz
8
Untuk kelengkapan lagi, berikut ini tautan ke "dengan": docs.djangoproject.com/en/1.8/ref/templates/builtins/#include
Timo
@Vor Jika saya melihat kembali context["these_items"]dan context["other_items"]saya dapat menggunakan termasuk dengan ini untuk mengganti {% for item in these_items %}dengan {% for item in other_items %}?
GiannisIordanou
untuk beberapa alasan, jika variabel memiliki _ pada namanya, itu tidak berfungsi. Contoh: {% include "subject_file_upload.html" dengan my_form = form foo = bar%}. Ada penjelasan untuk ini?
Alan Tygel