กำหนดตัวแปรให้กับเทมเพลตลูกในแท็ก Django {% include%}


91

ฉันมีรหัสนี้ (ซึ่งไม่ได้ให้ผลลัพธ์ที่คาดหวัง)

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

แม่แบบเด็ก:

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

และมุมมองของฉัน

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

โค้ดด้านบนสร้าง HTML ในแบบที่ฉันต้องการอย่างไรก็ตามแบบฟอร์มไม่อัปเดตฐานข้อมูล

แต่,

หากฉันข้ามเทมเพลตตรงกลางและไปที่แบบฟอร์มการอัปโหลดโดยตรงก็ใช้ได้ดี:

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

ช่วยฉันด้วยเพื่อให้มันใช้งานได้กับเทมเพลตกลาง ฉันต้องการทำสิ่งนี้เพราะฉันไม่ต้องการพิมพ์รหัสเดียวกันมากกว่าหนึ่งครั้ง


13
คุณได้ลองใช้includeกับwith?
Besnik

คำตอบ:


220

เช่นเดียวกับที่ @Besnik แนะนำมันค่อนข้างง่าย:

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

เอกสารincludeที่กล่าวถึงนี้ นอกจากนี้ยังระบุว่าคุณสามารถใช้onlyเพื่อแสดงเทมเพลตด้วยตัวแปรที่กำหนดเท่านั้นโดยไม่ต้องสืบทอดตัวแปรอื่น ๆ

ขอบคุณ @Besnik


4
เพื่อความสมบูรณ์โปรดทราบว่าหากคุณต้องการแสดงเทมเพลตด้วยตัวแปรที่กำหนดเท่านั้น (และไม่สืบทอดบริบทหลัก) คุณสามารถเพิ่มตัวเลือก "only": {% include "path / to / template.html" with form = form only}}
gonz

8
เพื่อความสมบูรณ์อีกครั้งนี่คือลิงก์ไปยัง "with": docs.djangoproject.com/th/1.8/ref/templates/builtins/#include
Timo

@ ถ้ามุมมองของฉันส่งคืนcontext["these_items"]และcontext["other_items"]ฉันสามารถใช้ include กับสิ่งนี้เพื่อแทนที่{% for item in these_items %}ด้วยได้{% for item in other_items %}หรือไม่?
GiannisIordanou

ด้วยเหตุผลบางประการหากตัวแปรมี _ อยู่ในชื่อมันจะไม่ทำงาน ตัวอย่าง: {% include "subject_file_upload.html" ด้วย my_form = form foo = bar%} คำอธิบายใด ๆ สำหรับเรื่องนี้?
Alan Tygel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.