Package: django-async-include
django-async-includeAsynchronous inclusion of Django templatesWhat's this?This is a project to help the ajax load of chunks of HTML with minimal effort on the developer side,
providing an easy way to improve web-site experience for your users by minimizing perceived loading times.This is the development repository.How does it work?The async_include template tag sends the context to the server using an AJAX request.In the case of model objects, it sends the model, application and id. In the case of QuerySets,
it sends the encrypted parametrized SQL. Of course, in the case of safe values like strings, booleans or numbers
this data are sent "as is".The receiver is a basic view of this application that renders the template with the received context and
returns it in the AJAX call.RequirementsThis application only depends onpycryptodomeandjsonpickle.Of course, you will needDjangoversion 1.10 or newer.jQueryNo jQuery is required as of version 0.6.6.Fontawesome (optional)Fontawesomeis the the-facto standard of font icons of our time. Include it in your project to see the spinner moving when loading the remote templates.The easiest way to include it by using a CDN. For example,bootstrap CDN(not affiliated, nor they endorse this project) is one of the most known.Default waiting spinner uses fontawesome. You can overwriteasync_include/spinner.htmltemplate if don't want to use
the default fontawesome style.InstallationUsing pipThis package is in pypiso you only have to write:pipinstalldjango-async-includeto install it.Install master versionInclude this code in your requirements.txt file:-egit://github.com/diegojromerolopez/django-async-include.git#egg=django_async_includeInstallation in your Django projectInclude the application in your project'ssettings.py:INSTALLED_APPS=[## ...'async_include',]Include django-async-include URLsInclude the URLs of Django-Async-Include in yoururls.pyproject in the namespaceasync_include:fromdjango.urlsimportpath,includeurlpatterns=[# ...path(r'async_include/',include('async_include.urls',namespace="async_include")),]UseLoad theasync_includetemplate tags at the top of your file and use theasync_includetemplate tag as a replacement of the django include template tag.You have to pass the local context explicitly to the async included templates, so you can pass all variables you
need in your included template as named parameters of theasync_includetemplate tag.{# Load the async_include template tag at the top of your template file #}
{% load async_include %}

{# Call the async_include template tag indicating what objects needs to replace it #}
{% async_include "<pathofthe>"<object1_name>=<object1><object2_name>=<object2>...<objectN_name>=<objectN>%}There is also a repository with a full example:django-async-include-example.Call javascript function whe load is completedPass the attributeonloadwith the name of the function you want to call after the request and the replacement
has been completed. e.g.{% async_include "boards/components/view/current_percentage_of_completion.html" board=board onload="load_board_style" %}Warning and limitationsObject dynamic attributesNo dynamic attribute will be passed to the templates given that only a reference to it is passed from the caller to the
included template callee.Don't use dynamic attributes inside an async_included template.However, the full object will be passed to the async_included template, so you could call its methods and properties
without any problem.QuerySetsEach QuerySet is passed as encrypted SQL and converted on the receiver to a RawQuerySet.Note that RawQuerySets have nolenmethod so length filter returns always 0.To fix this we have implemented a new version of the length filter
that will be loaded in your template if you overwrite it.{% load async_included %}Note that this templatetag file isasync_included, ending ined.ExamplesPassing an object{% load async_include %}

{# .. #}

{# Load the template and informs the board object is required for the included template  #}
{% async_include "boards/components/view/current_percentage_of_completion.html" board=board %}Passing a QuerySet{% load async_include %}

{# .. #}

{% async_include "boards/components/view/summary.html" board=board member=member next_due_date_cards=next_due_date_cards %}CustomizationSpinnerOverwriteasync_include/spinner.htmltemplate if you want to change the spinner from fontawesome one (default) by a
background image or an image. Otherwise, make sure you are loading fontawesome fonts.Note that the spinner must have classasync_included-spinner. Otherwise, the spinner behavior is going to be unpredictable.Show/Hide spinnerIncluding the optional parameterspinner__visible=Falsewhen calling the async_include template tag will not show the spinner block.{% load async_include %}

{# .. #}

{# Will not show the spinner #}
{% async_include "boards/components/view/last_comments.html" board=board spinner__visible=False %}Customize spinner template per async_include template tag callUse the optional parameterspinner__template_pathto set a different template path for a specific async_include
call in your templates.{% load async_include %}

{# .. #}

{# Will not show the spinner #}
{% async_include "boards/components/view/last_comments.html" board=board spinner__template_path="templates/comments/last_comments_spinner.html" %}Remember the spinner tag should contain theasync_included-spinnerclass.Block wrapper html tagWrapper tag isdivand maybe you don't want that. Sethtml__tagoptional  parameter to the name of the tag you need in that particular context.Example:{% load async_include %}

{# .. #}

{# Will be replaced by<li></li>block instead of<div></div>#}
{% async_include "boards/components/view/last_comments.html" board=board html__tag='li' %}Block wrapper html tag classCustomize the wrapper class by passinghtml__tag__classoptional parameter to the template tag.{% load async_include %}

{# .. #}

{# Will be replaced by<li></li>block instead of<div></div>#}
{# Class last_comments will be added to wrapper class #}
{% async_include "boards/components/view/last_comments.html" board=board html__tag='li' html__tag__class='last_comments' %}## Request frequencyIf do you want to make frequent requests, set request__frequency to the number of seconds you want
to make the requests.Example:{% load async_include %}

{# .. #}

{# Update the last comments each 60 seconds #}
{% async_include "boards/components/view/last_comments.html" board=board request__frequency=60 %}Main authorDiego J. Romero-López is a Software Engineer based on Madrid (Spain).This project is in no way endorsed or related in any way to my past or current employers.Contact me by email atdiegojREMOVETHISromerolopezREMOVETHIS@gmail.com.ContributorsErik Telepovský:Bug fixes.Modern mobile browser support.PyPy configuration fixes.Python3 support.Multi-language support.