Saya membuat aplikasi web berbasis Django yang dirender di sisi server. Namun sekarang ada beberapa halaman yang ingin saya render ulang menggunakan javascript dari feed.

Saya lebih suka menggunakan pendekatan KERING dan menggunakan kembali templat Django saya yang ada, memasukkannya ke halaman di dalam tag.

Kemudian saya dapat menggunakan perpustakaan templat pilihan saya (ada banyak yang mendukung templat Django)

Namun saya terjebak pada hal yang paling sederhana, sertakan template tanpa parsing! Inilah pendekatan yang saya coba yang tidak berhasil

Keluaran yang diharapkan

<ul>
    <li>John Doe</a></li>
    <li>Sally Taylor</a></li>
    <li>David Smith</a></li>
</ul>
<script type="text/template">
    <ul>
    {% for person in people %}
        <li>{{ person.name }}</a></li>
    {% endfor %}
    </ul>
</script>

Pendekatan 1 - berhasil tetapi saya harus mengulang html yang sama dua kali

Index.html

{% include "includes/list.html" %}
<script type="text/template">
    {% include "includes/list.html" with script=1 %}
</script>

List.html

{% if script = 1 %}
{% verbatim %}
    <ul>
        {% for person in people %}
            <li>{{ person.name }}</a></li>
        {% endfor %}
    </ul>
{% endverbatim %}
{% else %}
<ul>
    {% for person in people %}
        <li>{{ person.name }}</a></li>
    {% endfor %}
</ul>
{% endif %}

Pendekatan 2 - tidak keluar setelah mencapai loop

Index.html

{% include "includes/list.html" %}
<script type="text/template">
    {% include_raw "includes/list.html" %}
</script>

Tag.py

from django import template
from django.template import loader, Context

register = template.Library()

@register.simple_tag
def include_raw(templatename):
    return loader.get_template(templatename).render(Context())

Bantuan apa pun akan sangat dihargai!

0
Kim T 14 Mei 2015, 03:16
{% if script = 1 %} harus {% if script == 1 %}
 – 
karthikr
14 Mei 2015, 03:52
Metode itu berfungsi dengan benar, tetapi itu berarti saya harus mengulang html saya dua kali!
 – 
Kim T
14 Mei 2015, 04:01

1 menjawab

Jawaban Terbaik

Jadi saya menyelesaikannya menggunakan solusi ini: https://gist.github.com/HenrikJoreteg/742160

Kode untuk membuatnya berfungsi adalah:

Index.html

{% load pages_tags %}
{% include "includes/list.html" %}
<script type="text/template">
    {% raw_include "includes/list.html" %}
</script>

List.html

<ul>
    {% for person in people %}
        <li>{{ person.name }}</a></li>
    {% endfor %}
</ul>

Halaman_tags.py

from django import template, conf
register = template.Library()

@register.simple_tag
def raw_include(path):
    import os.path

    for template_dir in conf.settings.TEMPLATE_DIRS:
        filepath = '%s/%s' % (template_dir, path)
        if os.path.isfile(filepath):
            break

    fp = open(filepath, 'r')
    output = fp.read()
    fp.close()
    return output

Berikut adalah contoh proyek yang menunjukkan semuanya bekerja bersama, termasuk merender template sisi klien dengan JavaScript:

https://github.com/kmturley/django-client-templates

Dan saya juga membuat jsperf ini untuk menguji kinerja perpustakaan templating gaya jinja yang berbeda:

https://jsperf.com/jinja-client-side-libraries/5

0
Kim T 14 Mei 2015, 16:53