django-select2/docs/_build/html/_modules/django_select2/widgets.html
2012-10-04 23:23:21 +05:30

604 lines
No EOL
65 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>django_select2.widgets &mdash; Django-Select2 3.1.2 documentation</title>
<link rel="stylesheet" href="../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../',
VERSION: '3.1.2',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<link rel="top" title="Django-Select2 3.1.2 documentation" href="../../index.html" />
<link rel="up" title="Module code" href="../index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../index.html">Django-Select2 3.1.2 documentation</a> &raquo;</li>
<li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1>Source code for django_select2.widgets</h1><div class="highlight"><pre>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Contains all the Django widgets for Select2.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">chain</span>
<span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">forms</span>
<span class="kn">from</span> <span class="nn">django.utils.encoding</span> <span class="kn">import</span> <span class="n">force_unicode</span>
<span class="kn">from</span> <span class="nn">django.utils.safestring</span> <span class="kn">import</span> <span class="n">mark_safe</span>
<span class="kn">from</span> <span class="nn">django.core.urlresolvers</span> <span class="kn">import</span> <span class="n">reverse</span>
<span class="kn">from</span> <span class="nn">django.utils.datastructures</span> <span class="kn">import</span> <span class="n">MultiValueDict</span><span class="p">,</span> <span class="n">MergeDict</span>
<span class="kn">from</span> <span class="nn">.util</span> <span class="kn">import</span> <span class="n">render_js_script</span><span class="p">,</span> <span class="n">convert_to_js_string_arr</span><span class="p">,</span> <span class="n">JSVar</span><span class="p">,</span> <span class="n">JSFunction</span><span class="p">,</span> <span class="n">JSFunctionInContext</span><span class="p">,</span> \
<span class="n">convert_dict_to_js_map</span><span class="p">,</span> <span class="n">convert_to_js_arr</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_select2_js_path</span><span class="p">():</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">configured</span> <span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">:</span>
<span class="k">return</span> <span class="s">&#39;js/select2.js&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="s">&#39;js/select2.min.js&#39;</span>
<span class="c">### Light mixin and widgets ###</span>
<div class="viewcode-block" id="Select2Mixin"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.Select2Mixin">[docs]</a><span class="k">class</span> <span class="nc">Select2Mixin</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The base mixin of all Select2 widgets.</span>
<span class="sd"> This mixin is responsible for rendering the necessary Javascript and CSS codes which turns normal ``&lt;select&gt;``</span>
<span class="sd"> markups into Select2 choice list.</span>
<span class="sd"> The following Select2 otions are added by this mixin:-</span>
<span class="sd"> * minimumResultsForSearch: ``6``</span>
<span class="sd"> * placeholder: ``&#39;&#39;``</span>
<span class="sd"> * allowClear: ``True``</span>
<span class="sd"> * multiple: ``False``</span>
<span class="sd"> * closeOnSelect: ``False``</span>
<span class="sd"> .. note:: Many of them would be removed by sub-classes depending on requirements.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c"># For details on these options refer: http://ivaynberg.github.com/select2/#documentation</span>
<span class="n">options</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&#39;minimumResultsForSearch&#39;</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span> <span class="c"># Only applicable for single value select.</span>
<span class="s">&#39;placeholder&#39;</span><span class="p">:</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="c"># Empty text label</span>
<span class="s">&#39;allowClear&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span> <span class="c"># Not allowed when field is multiple since there each value has a clear button.</span>
<span class="s">&#39;multiple&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span> <span class="c"># Not allowed when attached to &lt;select&gt;</span>
<span class="s">&#39;closeOnSelect&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
<span class="p">}</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The options listed in this are rendered as JS map and passed to Select2 JS code.</span>
<span class="sd"> The complete description of theses options are available in Select2_ JS&#39; site.</span>
<span class="sd"> .. _Select2: http://ivaynberg.github.com/select2/#documentation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="Select2Mixin.__init__"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.Select2Mixin.__init__">[docs]</a> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Constructor of the class.</span>
<span class="sd"> The following additional kwarg is allowed:-</span>
<span class="sd"> :param select2_options: This is similar to standard Django way to pass extra attributes to widgets.</span>
<span class="sd"> This is meant to override values of existing :py:attr:`.options`.</span>
<span class="sd"> Example::</span>
<span class="sd"> class MyForm(ModelForm):</span>
<span class="sd"> class Meta:</span>
<span class="sd"> model = MyModel</span>
<span class="sd"> widgets = {</span>
<span class="sd"> &#39;name&#39;: Select2WidgetName(select2_options={</span>
<span class="sd"> &#39;minimumResultsForSearch&#39;: 10,</span>
<span class="sd"> &#39;closeOnSelect&#39;: True,</span>
<span class="sd"> })</span>
<span class="sd"> }</span>
<span class="sd"> .. tip:: You cannot introduce new options using this. For that you should sub-class and overried</span>
<span class="sd"> :py:meth:`.init_options`. The reason for this is, few options are not compatible with each other</span>
<span class="sd"> or are not applicable in some scenarios. For example, when Select2 is attached to ``&lt;select&gt;`` tag,</span>
<span class="sd"> it can get if it is multiple or single valued from that tag itself. In this case if you specify</span>
<span class="sd"> ``multiple`` option then not only it is useless but an error in Select2 JS&#39; point of view.</span>
<span class="sd"> There are other such intricacies, based on which some options are removed. By enforcing this</span>
<span class="sd"> restriction we make sure to not break the code by passing some wrong concotion of options.</span>
<span class="sd"> :type select2_options: :py:obj:`dict` or None</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">)</span> <span class="c"># Making an instance specific copy</span>
<span class="bp">self</span><span class="o">.</span><span class="n">init_options</span><span class="p">()</span>
<span class="n">select2_options</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;select2_options&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">select2_options</span><span class="p">:</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">select2_options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">Select2Mixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Select2Mixin.init_options"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.Select2Mixin.init_options">[docs]</a> <span class="k">def</span> <span class="nf">init_options</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Sub-classes can use this to pass additional options to Select2 JS library.</span>
<span class="sd"> Example::</span>
<span class="sd"> def init_options(self):</span>
<span class="sd"> self.options[&#39;createSearchChoice&#39;] = JSFunction(&#39;Your_js_function&#39;)</span>
<span class="sd"> In the above example we are setting ``Your_js_function`` as Select2&#39;s ``createSearchChoice``</span>
<span class="sd"> function.</span>
<span class="sd"> .. tip:: If you want to run ``Your_js_function`` in the context of the Select2 DOM element,</span>
<span class="sd"> i.e. ``this`` inside your JS function should point to the component instead of ``window``, then</span>
<span class="sd"> use :py:class:`~.util.JSFunctionInContext` instead of :py:class:`~.util.JSFunction`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span>
</div>
<div class="viewcode-block" id="Select2Mixin.set_placeholder"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.Select2Mixin.set_placeholder">[docs]</a> <span class="k">def</span> <span class="nf">set_placeholder</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Placeholder is a value which Select2 JS library shows when nothing is selected. This should be string.</span>
<span class="sd"> </span>
<span class="sd"> :return: None</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s">&#39;placeholder&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
</div>
<div class="viewcode-block" id="Select2Mixin.get_options"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.Select2Mixin.get_options">[docs]</a> <span class="k">def</span> <span class="nf">get_options</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> :return: Dictionary of options to be passed to Select2 JS.</span>
<span class="sd"> </span>
<span class="sd"> :rtype: :py:obj:`dict`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">options</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">)</span>
<span class="k">if</span> <span class="n">options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;allowClear&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">options</span><span class="p">[</span><span class="s">&#39;allowClear&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_required</span>
<span class="k">return</span> <span class="n">options</span>
</div>
<div class="viewcode-block" id="Select2Mixin.render_select2_options_code"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.Select2Mixin.render_select2_options_code">[docs]</a> <span class="k">def</span> <span class="nf">render_select2_options_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">id_</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Renders options for Select2 JS.</span>
<span class="sd"> </span>
<span class="sd"> :return: The rendered JS code.</span>
<span class="sd"> :rtype: :py:obj:`unicode`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">convert_dict_to_js_map</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">id_</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Select2Mixin.render_js_code"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.Select2Mixin.render_js_code">[docs]</a> <span class="k">def</span> <span class="nf">render_js_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">id_</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Renders the ``&lt;script&gt;`` block which contains the JS code for this widget.</span>
<span class="sd"> </span>
<span class="sd"> :return: The rendered JS code enclosed inside ``&lt;script&gt;`` block.</span>
<span class="sd"> :rtype: :py:obj:`unicode`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">id_</span><span class="p">:</span>
<span class="k">return</span> <span class="n">render_js_script</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">render_inner_js_code</span><span class="p">(</span><span class="n">id_</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">))</span>
<span class="k">return</span> <span class="s">u&#39;&#39;</span>
</div>
<div class="viewcode-block" id="Select2Mixin.render_inner_js_code"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.Select2Mixin.render_inner_js_code">[docs]</a> <span class="k">def</span> <span class="nf">render_inner_js_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">id_</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Renders all the JS code required for this widget.</span>
<span class="sd"> </span>
<span class="sd"> :return: The rendered JS code which will be later enclosed inside ``&lt;script&gt;`` block.</span>
<span class="sd"> :rtype: :py:obj:`unicode`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">options</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_options</span><span class="p">())</span>
<span class="n">options</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">render_select2_options_code</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">id_</span><span class="p">)</span>
<span class="k">return</span> <span class="s">u&#39;$(&quot;#</span><span class="si">%s</span><span class="s">&quot;).select2(</span><span class="si">%s</span><span class="s">);&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">id_</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Select2Mixin.render"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.Select2Mixin.render">[docs]</a> <span class="k">def</span> <span class="nf">render</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">attrs</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">choices</span><span class="o">=</span><span class="p">()):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Renders this widget. Html and JS code blocks all are rendered by this.</span>
<span class="sd"> </span>
<span class="sd"> :return: The rendered markup.</span>
<span class="sd"> :rtype: :py:obj:`unicode`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">attrs</span><span class="p">]</span>
<span class="k">if</span> <span class="n">choices</span><span class="p">:</span> <span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">choices</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="nb">super</span><span class="p">(</span><span class="n">Select2Mixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span> <span class="c"># Thanks to @ouhouhsami Issue#1</span>
<span class="n">s</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">media</span><span class="o">.</span><span class="n">render</span><span class="p">()</span>
<span class="n">final_attrs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">build_attrs</span><span class="p">(</span><span class="n">attrs</span><span class="p">)</span>
<span class="n">id_</span> <span class="o">=</span> <span class="n">final_attrs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;id&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="n">s</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">render_js_code</span><span class="p">(</span><span class="n">id_</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">attrs</span><span class="p">,</span> <span class="n">choices</span><span class="p">)</span>
<span class="k">if</span> <span class="n">logger</span><span class="o">.</span><span class="n">isEnabledFor</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">):</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Generated widget code:-</span><span class="se">\n</span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
<span class="k">return</span> <span class="n">mark_safe</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
</div>
<span class="k">class</span> <span class="nc">Media</span><span class="p">:</span>
<span class="n">js</span> <span class="o">=</span> <span class="p">(</span><span class="n">get_select2_js_path</span><span class="p">(),</span> <span class="p">)</span>
<span class="n">css</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;screen&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s">&#39;css/select2.css&#39;</span><span class="p">,</span> <span class="s">&#39;css/extra.css&#39;</span><span class="p">,</span> <span class="p">)}</span>
</div>
<div class="viewcode-block" id="Select2Widget"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.Select2Widget">[docs]</a><span class="k">class</span> <span class="nc">Select2Widget</span><span class="p">(</span><span class="n">Select2Mixin</span><span class="p">,</span> <span class="n">forms</span><span class="o">.</span><span class="n">Select</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Drop-in Select2 replacement for :py:class:`forms.Select`.</span>
<span class="sd"> Following Select2 option from :py:attr:`.Select2Mixin.options` is removed:-</span>
<span class="sd"> * multiple</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">init_options</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;multiple&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">render_options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">choices</span><span class="p">,</span> <span class="n">selected_choices</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_required</span><span class="p">:</span>
<span class="n">choices</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">choices</span><span class="p">)</span>
<span class="n">choices</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">&#39;&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="p">))</span> <span class="c"># Adding an empty choice</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">Select2Widget</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">render_options</span><span class="p">(</span><span class="n">choices</span><span class="p">,</span> <span class="n">selected_choices</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Select2MultipleWidget"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.Select2MultipleWidget">[docs]</a><span class="k">class</span> <span class="nc">Select2MultipleWidget</span><span class="p">(</span><span class="n">Select2Mixin</span><span class="p">,</span> <span class="n">forms</span><span class="o">.</span><span class="n">SelectMultiple</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Drop-in Select2 replacement for :py:class:`forms.SelectMultiple`.</span>
<span class="sd"> Following Select2 options from :py:attr:`.Select2Mixin.options` are removed:-</span>
<span class="sd"> * multiple</span>
<span class="sd"> * allowClear</span>
<span class="sd"> * minimumResultsForSearch</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">init_options</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;multiple&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;allowClear&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;minimumResultsForSearch&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="c">### Specialized Multiple Hidden Input Widget ###</span></div>
<div class="viewcode-block" id="MultipleSelect2HiddenInput"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.MultipleSelect2HiddenInput">[docs]</a><span class="k">class</span> <span class="nc">MultipleSelect2HiddenInput</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">TextInput</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Multiple hidden input for Select2.</span>
<span class="sd"> This is a specialized multiple Hidden Input widget. This includes a special</span>
<span class="sd"> JS component which renders multiple Hidden Input boxes as there are values.</span>
<span class="sd"> So, if user suppose chooses values 1, 4 and 9 then Select2 would would write them</span>
<span class="sd"> to the primary hidden input. The JS component of this widget will read that value and</span>
<span class="sd"> will render three more hidden input boxes each with values 1, 4 and 9 respectively.</span>
<span class="sd"> They will all share the name of this field, and the name of the primary source</span>
<span class="sd"> hidden input would be removed. This way, when submitted all the selected values</span>
<span class="sd"> would be available as list.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">input_type</span> <span class="o">=</span> <span class="s">&#39;hidden&#39;</span> <span class="c"># We want it hidden but should be treated as if is_hidden is False</span>
<span class="k">def</span> <span class="nf">render</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">attrs</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">choices</span><span class="o">=</span><span class="p">()):</span>
<span class="n">attrs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">build_attrs</span><span class="p">(</span><span class="n">attrs</span><span class="p">,</span> <span class="n">multiple</span><span class="o">=</span><span class="s">&#39;multiple&#39;</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="nb">super</span><span class="p">(</span><span class="n">MultipleSelect2HiddenInput</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s">u&quot;&quot;</span><span class="p">,</span> <span class="n">attrs</span><span class="p">))</span>
<span class="n">id_</span> <span class="o">=</span> <span class="n">attrs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;id&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">id_</span><span class="p">:</span>
<span class="n">jscode</span> <span class="o">=</span> <span class="s">u&#39;&#39;</span>
<span class="k">if</span> <span class="n">value</span><span class="p">:</span>
<span class="n">jscode</span> <span class="o">=</span> <span class="s">u&quot;$(&#39;#</span><span class="si">%s</span><span class="s">&#39;).val(django_select2.convertArrToStr(</span><span class="si">%s</span><span class="s">));&quot;</span> \
<span class="o">%</span> <span class="p">(</span><span class="n">id_</span><span class="p">,</span> <span class="n">convert_to_js_arr</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">id_</span><span class="p">))</span>
<span class="n">jscode</span> <span class="o">+=</span> <span class="s">u&quot;django_select2.initMultipleHidden($(&#39;#</span><span class="si">%s</span><span class="s">&#39;));&quot;</span> <span class="o">%</span> <span class="n">id_</span>
<span class="n">s</span> <span class="o">+=</span> <span class="n">render_js_script</span><span class="p">(</span><span class="n">jscode</span><span class="p">)</span>
<span class="k">return</span> <span class="n">s</span>
<span class="k">def</span> <span class="nf">value_from_datadict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">files</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="p">(</span><span class="n">MultiValueDict</span><span class="p">,</span> <span class="n">MergeDict</span><span class="p">)):</span>
<span class="k">return</span> <span class="n">data</span><span class="o">.</span><span class="n">getlist</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="c">### Heavy mixins and widgets ###</span>
</div>
<div class="viewcode-block" id="HeavySelect2Mixin"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.HeavySelect2Mixin">[docs]</a><span class="k">class</span> <span class="nc">HeavySelect2Mixin</span><span class="p">(</span><span class="n">Select2Mixin</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The base mixin of all Heavy Select2 widgets. It sub-classes :py:class:`Select2Mixin`.</span>
<span class="sd"> This mixin adds more Select2 options to :py:attr:`.Select2Mixin.options`. These are:-</span>
<span class="sd"> * minimumInputLength: ``2``</span>
<span class="sd"> * initSelection: ``JSFunction(&#39;django_select2.onInit&#39;)``</span>
<span class="sd"> * ajax:</span>
<span class="sd"> * dataType: ``&#39;json&#39;``</span>
<span class="sd"> * quietMillis: ``100``</span>
<span class="sd"> * data: ``JSFunctionInContext(&#39;django_select2.get_url_params&#39;)``</span>
<span class="sd"> * results: ``JSFunctionInContext(&#39;django_select2.process_results&#39;)``</span>
<span class="sd"> .. tip:: You can override these options by passing ``select2_options`` kwarg to :py:meth:`.__init__`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="HeavySelect2Mixin.__init__"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.HeavySelect2Mixin.__init__">[docs]</a> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Constructor of the class.</span>
<span class="sd"> The following kwargs are allowed:-</span>
<span class="sd"> :param data_view: A :py:class:`~.views.Select2View` sub-class which can respond to this widget&#39;s Ajax queries.</span>
<span class="sd"> :type data_view: :py:class:`django.views.generic.base.View` or None</span>
<span class="sd"> :param data_url: Url which will respond to Ajax queries with JSON object.</span>
<span class="sd"> :type data_url: :py:obj:`str` or None</span>
<span class="sd"> .. tip:: When ``data_view`` is provided then it is converted into Url using</span>
<span class="sd"> :py:func:`~django.core.urlresolvers.reverse`.</span>
<span class="sd"> .. warning:: Either of ``data_view`` or ``data_url`` must be specified, else :py:exc:`ValueError` would</span>
<span class="sd"> be raised.</span>
<span class="sd"> :param choices: The list of available choices. If not provided then empty list is used instead. It</span>
<span class="sd"> should be of the form -- ``[(val1, &#39;Label1&#39;), (val2, &#39;Label2&#39;), ...]``.</span>
<span class="sd"> :type choices: :py:obj:`list` or :py:obj:`tuple`</span>
<span class="sd"> :param userGetValTextFuncName: The name of the custom JS function which you want to use to convert</span>
<span class="sd"> value to label.</span>
<span class="sd"> In ``heavy_data.js``, ``django_select2.getValText()`` employs the following logic to convert value</span>
<span class="sd"> to label :-</span>
<span class="sd"> 1. First check if the Select2 input field has ``txt`` attribute set along with ``value``. If found</span>
<span class="sd"> then use it.</span>
<span class="sd"> 2. Otherwise, check if user has provided any custom method for this. Then use that. If it returns a</span>
<span class="sd"> label then use it.</span>
<span class="sd"> 3. Otherwise, check the cached results. When the user searches in the fields then all the returned</span>
<span class="sd"> responses from server, which has the value and label mapping, are cached by ``heavy_data.js``.</span>
<span class="sd"> 4. If we still do not have the label then check the cookies. When user selects some value then</span>
<span class="sd"> ``heavy_data.js`` stores the selected values and their labels in the cookies. These are cleared</span>
<span class="sd"> when browser is closed.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">field</span> <span class="o">=</span> <span class="bp">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">)</span> <span class="c"># Making an instance specific copy</span>
<span class="bp">self</span><span class="o">.</span><span class="n">view</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;data_view&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;data_url&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">userGetValTextFuncName</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;userGetValTextFuncName&#39;</span><span class="p">,</span> <span class="s">u&#39;null&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">choices</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;choices&#39;</span><span class="p">,</span> <span class="p">[])</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">view</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">url</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&#39;data_view or data_url is required&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s">&#39;ajax&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&#39;dataType&#39;</span><span class="p">:</span> <span class="s">&#39;json&#39;</span><span class="p">,</span>
<span class="s">&#39;quietMillis&#39;</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
<span class="s">&#39;data&#39;</span><span class="p">:</span> <span class="n">JSFunctionInContext</span><span class="p">(</span><span class="s">&#39;django_select2.get_url_params&#39;</span><span class="p">),</span>
<span class="s">&#39;results&#39;</span><span class="p">:</span> <span class="n">JSFunctionInContext</span><span class="p">(</span><span class="s">&#39;django_select2.process_results&#39;</span><span class="p">),</span>
<span class="p">}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s">&#39;minimumInputLength&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s">&#39;initSelection&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">JSFunction</span><span class="p">(</span><span class="s">&#39;django_select2.onInit&#39;</span><span class="p">)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">HeavySelect2Mixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="HeavySelect2Mixin.render_texts"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.HeavySelect2Mixin.render_texts">[docs]</a> <span class="k">def</span> <span class="nf">render_texts</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">selected_choices</span><span class="p">,</span> <span class="n">choices</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Renders a JS array with labels for the ``selected_choices``.</span>
<span class="sd"> :param selected_choices: List of selected choices&#39; values.</span>
<span class="sd"> :type selected_choices: :py:obj:`list` or :py:obj:`tuple`</span>
<span class="sd"> :param choices: Extra choices, if any. This is a list of tuples. In each tuple, the first</span>
<span class="sd"> item is the choice value and the second item is choice label.</span>
<span class="sd"> :type choices: :py:obj:`list` or :py:obj:`tuple`</span>
<span class="sd"> :return: The rendered JS array code.</span>
<span class="sd"> :rtype: :py:obj:`unicode`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">selected_choices</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">force_unicode</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">selected_choices</span><span class="p">)</span>
<span class="n">txts</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">all_choices</span> <span class="o">=</span> <span class="n">choices</span> <span class="k">if</span> <span class="n">choices</span> <span class="k">else</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">val</span><span class="p">,</span> <span class="n">txt</span> <span class="ow">in</span> <span class="n">chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">choices</span><span class="p">,</span> <span class="n">all_choices</span><span class="p">):</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">force_unicode</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="k">if</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">selected_choices</span><span class="p">:</span>
<span class="n">selected_choices</span> <span class="o">=</span> <span class="p">[</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">selected_choices</span> <span class="k">if</span> <span class="n">v</span> <span class="o">!=</span> <span class="n">val</span><span class="p">]</span>
<span class="n">txts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">txt</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="p">,</span> <span class="s">&#39;_get_val_txt&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">selected_choices</span><span class="p">:</span>
<span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">selected_choices</span><span class="p">:</span>
<span class="n">txt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">_get_val_txt</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="k">if</span> <span class="n">txt</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">txts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">txt</span><span class="p">)</span>
<span class="k">if</span> <span class="n">txts</span><span class="p">:</span>
<span class="k">return</span> <span class="n">convert_to_js_string_arr</span><span class="p">(</span><span class="n">txts</span><span class="p">)</span>
</div>
<span class="k">def</span> <span class="nf">get_options</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">url</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="n">reverse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">view</span><span class="p">)</span> <span class="c"># We lazy resolve the view. By this time Url conf would been loaded fully.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s">&#39;ajax&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;url&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s">&#39;ajax&#39;</span><span class="p">][</span><span class="s">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">url</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">HeavySelect2Mixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_options</span><span class="p">()</span>
<div class="viewcode-block" id="HeavySelect2Mixin.render_texts_for_value"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.HeavySelect2Mixin.render_texts_for_value">[docs]</a> <span class="k">def</span> <span class="nf">render_texts_for_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">id_</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">choices</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Renders the JS code which sets the ``txt`` attribute on the field. It gets the array</span>
<span class="sd"> of lables from :py:meth:`.render_texts`.</span>
<span class="sd"> :param id_: Id of the field. This can be used to get reference of this field&#39;s DOM in JS.</span>
<span class="sd"> :type id_: :py:obj:`str`</span>
<span class="sd"> :param value: Currently set value on the field.</span>
<span class="sd"> :type value: Any</span>
<span class="sd"> :param choices: Extra choices, if any. This is a list of tuples. In each tuple, the first</span>
<span class="sd"> item is the choice value and the second item is choice label.</span>
<span class="sd"> :type choices: :py:obj:`list` or :py:obj:`tuple`</span>
<span class="sd"> :return: JS code which sets the ``txt`` attribute.</span>
<span class="sd"> :rtype: :py:obj:`unicode`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="n">value</span><span class="p">]</span> <span class="c"># Just like forms.Select.render() it assumes that value will be single valued.</span>
<span class="n">texts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">render_texts</span><span class="p">(</span><span class="n">values</span><span class="p">,</span> <span class="n">choices</span><span class="p">)</span>
<span class="k">if</span> <span class="n">texts</span><span class="p">:</span>
<span class="k">return</span> <span class="s">u&quot;$(&#39;#</span><span class="si">%s</span><span class="s">&#39;).txt(</span><span class="si">%s</span><span class="s">);&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">id_</span><span class="p">,</span> <span class="n">texts</span><span class="p">)</span>
</div>
<span class="k">def</span> <span class="nf">render_inner_js_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">id_</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">attrs</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">choices</span><span class="o">=</span><span class="p">(),</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="n">js</span> <span class="o">=</span> <span class="s">u&quot;$(&#39;#</span><span class="si">%s</span><span class="s">&#39;).change(django_select2.onValChange).data(&#39;userGetValText&#39;, </span><span class="si">%s</span><span class="s">);&quot;</span> \
<span class="o">%</span> <span class="p">(</span><span class="n">id_</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">userGetValTextFuncName</span><span class="p">)</span>
<span class="n">texts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">render_texts_for_value</span><span class="p">(</span><span class="n">id_</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">choices</span><span class="p">)</span>
<span class="k">if</span> <span class="n">texts</span><span class="p">:</span>
<span class="n">js</span> <span class="o">+=</span> <span class="n">texts</span>
<span class="n">js</span> <span class="o">+=</span> <span class="nb">super</span><span class="p">(</span><span class="n">HeavySelect2Mixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">render_inner_js_code</span><span class="p">(</span><span class="n">id_</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">attrs</span><span class="p">,</span> <span class="n">choices</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">return</span> <span class="n">js</span>
<span class="k">class</span> <span class="nc">Media</span><span class="p">:</span>
<span class="n">js</span> <span class="o">=</span> <span class="p">(</span><span class="n">get_select2_js_path</span><span class="p">(),</span> <span class="s">&#39;js/heavy_data.js&#39;</span><span class="p">,</span> <span class="p">)</span>
<span class="n">css</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;screen&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s">&#39;css/select2.css&#39;</span><span class="p">,</span> <span class="s">&#39;css/extra.css&#39;</span><span class="p">,</span> <span class="p">)}</span>
</div>
<div class="viewcode-block" id="HeavySelect2Widget"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.HeavySelect2Widget">[docs]</a><span class="k">class</span> <span class="nc">HeavySelect2Widget</span><span class="p">(</span><span class="n">HeavySelect2Mixin</span><span class="p">,</span> <span class="n">forms</span><span class="o">.</span><span class="n">TextInput</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Single selection heavy widget.</span>
<span class="sd"> Following Select2 option from :py:attr:`.Select2Mixin.options` is added or set:-</span>
<span class="sd"> * multiple: ``False``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">input_type</span> <span class="o">=</span> <span class="s">&#39;hidden&#39;</span> <span class="c"># We want it hidden but should be treated as if is_hidden is False</span>
<span class="k">def</span> <span class="nf">init_options</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s">&#39;multiple&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span>
</div>
<div class="viewcode-block" id="HeavySelect2MultipleWidget"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.HeavySelect2MultipleWidget">[docs]</a><span class="k">class</span> <span class="nc">HeavySelect2MultipleWidget</span><span class="p">(</span><span class="n">HeavySelect2Mixin</span><span class="p">,</span> <span class="n">MultipleSelect2HiddenInput</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Multiple selection heavy widget.</span>
<span class="sd"> Following Select2 options from :py:attr:`.Select2Mixin.options` are removed:-</span>
<span class="sd"> * allowClear</span>
<span class="sd"> * minimumResultsForSearch</span>
<span class="sd"> Following Select2 options from :py:attr:`.Select2Mixin.options` are added or set:-</span>
<span class="sd"> * multiple: ``False``</span>
<span class="sd"> * separator: ``JSVar(&#39;django_select2.MULTISEPARATOR&#39;)``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">init_options</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s">&#39;multiple&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;allowClear&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;minimumResultsForSearch&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s">&#39;separator&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">JSVar</span><span class="p">(</span><span class="s">&#39;django_select2.MULTISEPARATOR&#39;</span><span class="p">)</span>
<div class="viewcode-block" id="HeavySelect2MultipleWidget.render_texts_for_value"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.HeavySelect2MultipleWidget.render_texts_for_value">[docs]</a> <span class="k">def</span> <span class="nf">render_texts_for_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">id_</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">choices</span><span class="p">):</span> <span class="c"># value is expected to be a list of values</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Renders the JS code which sets the ``txt`` attribute on the field. It gets the array</span>
<span class="sd"> of lables from :py:meth:`.render_texts`.</span>
<span class="sd"> :param id_: Id of the field. This can be used to get reference of this field&#39;s DOM in JS.</span>
<span class="sd"> :type id_: :py:obj:`str`</span>
<span class="sd"> :param value: **List** of currently set value on the field.</span>
<span class="sd"> :type value: :py:obj:`list`</span>
<span class="sd"> :param choices: Extra choices, if any. This is a list of tuples. In each tuple, the first</span>
<span class="sd"> item is the choice value and the second item is choice label.</span>
<span class="sd"> :type choices: :py:obj:`list` or :py:obj:`tuple`</span>
<span class="sd"> :return: JS code which sets the ``txt`` attribute.</span>
<span class="sd"> :rtype: :py:obj:`unicode`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">value</span><span class="p">:</span> <span class="c"># Just like forms.SelectMultiple.render() it assumes that value will be multi-valued (list).</span>
<span class="n">texts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">render_texts</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">choices</span><span class="p">)</span>
<span class="k">if</span> <span class="n">texts</span><span class="p">:</span>
<span class="k">return</span> <span class="s">u&quot;$(&#39;#</span><span class="si">%s</span><span class="s">&#39;).txt(</span><span class="si">%s</span><span class="s">);&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">id_</span><span class="p">,</span> <span class="n">texts</span><span class="p">)</span>
<span class="c">### Auto Heavy widgets ###</span>
</div></div>
<div class="viewcode-block" id="AutoHeavySelect2Mixin"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.AutoHeavySelect2Mixin">[docs]</a><span class="k">class</span> <span class="nc">AutoHeavySelect2Mixin</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This mixin is needed for Auto heavy fields.</span>
<span class="sd"> This mxin adds extra JS code to notify the field&#39;s DOM object of the generated id. The generated id</span>
<span class="sd"> is not the same as the ``id`` attribute of the field&#39;s Html markup. This id is generated by</span>
<span class="sd"> :py:func:`~.util.register_field` when the Auto field is registered. The client side (DOM) sends this</span>
<span class="sd"> id along with the Ajax request, so that the central view can identify which field should be used to</span>
<span class="sd"> serve the request.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">render_inner_js_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">id_</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="n">js</span> <span class="o">=</span> <span class="s">u&quot;$(&#39;#</span><span class="si">%s</span><span class="s">&#39;).data(&#39;field_id&#39;, &#39;</span><span class="si">%s</span><span class="s">&#39;);&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">id_</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">field_id</span><span class="p">)</span>
<span class="n">js</span> <span class="o">+=</span> <span class="nb">super</span><span class="p">(</span><span class="n">AutoHeavySelect2Mixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">render_inner_js_code</span><span class="p">(</span><span class="n">id_</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">return</span> <span class="n">js</span>
</div>
<div class="viewcode-block" id="AutoHeavySelect2Widget"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.AutoHeavySelect2Widget">[docs]</a><span class="k">class</span> <span class="nc">AutoHeavySelect2Widget</span><span class="p">(</span><span class="n">AutoHeavySelect2Mixin</span><span class="p">,</span> <span class="n">HeavySelect2Widget</span><span class="p">):</span>
<span class="s">&quot;Auto version of :py:class:`.HeavySelect2Widget`&quot;</span>
<span class="k">pass</span>
</div>
<div class="viewcode-block" id="AutoHeavySelect2MultipleWidget"><a class="viewcode-back" href="../../ref_widgets.html#django_select2.widgets.AutoHeavySelect2MultipleWidget">[docs]</a><span class="k">class</span> <span class="nc">AutoHeavySelect2MultipleWidget</span><span class="p">(</span><span class="n">AutoHeavySelect2Mixin</span><span class="p">,</span> <span class="n">HeavySelect2MultipleWidget</span><span class="p">):</span>
<span class="s">&quot;Auto version of :py:class:`.HeavySelect2MultipleWidget`&quot;</span>
<span class="k">pass</span>
</pre></div></div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../index.html">Django-Select2 3.1.2 documentation</a> &raquo;</li>
<li><a href="../index.html" >Module code</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2012, Nirupam Biswas.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>