mirror of
https://github.com/Hopiu/django-select2.git
synced 2026-03-19 23:00:24 +00:00
604 lines
No EOL
65 KiB
HTML
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 — 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> »</li>
|
|
<li><a href="../index.html" accesskey="U">Module code</a> »</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">"""</span>
|
|
<span class="sd">Contains all the Django widgets for Select2.</span>
|
|
<span class="sd">"""</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">'js/select2.js'</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s">'js/select2.min.js'</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">"""</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 ``<select>``</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: ``''``</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"> """</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">'minimumResultsForSearch'</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">'placeholder'</span><span class="p">:</span> <span class="s">''</span><span class="p">,</span> <span class="c"># Empty text label</span>
|
|
<span class="s">'allowClear'</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">'multiple'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span> <span class="c"># Not allowed when attached to <select></span>
|
|
<span class="s">'closeOnSelect'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
|
|
<span class="p">}</span>
|
|
<span class="sd">"""</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' site.</span>
|
|
|
|
<span class="sd"> .. _Select2: http://ivaynberg.github.com/select2/#documentation.</span>
|
|
<span class="sd"> """</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">"""</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"> 'name': Select2WidgetName(select2_options={</span>
|
|
<span class="sd"> 'minimumResultsForSearch': 10,</span>
|
|
<span class="sd"> 'closeOnSelect': 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 ``<select>`` 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' 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"> """</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">'select2_options'</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">"""</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['createSearchChoice'] = JSFunction('Your_js_function')</span>
|
|
|
|
<span class="sd"> In the above example we are setting ``Your_js_function`` as Select2'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"> """</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">"""</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"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s">'placeholder'</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">"""</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"> """</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">'allowClear'</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">'allowClear'</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">"""</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"> """</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">"""</span>
|
|
<span class="sd"> Renders the ``<script>`` block which contains the JS code for this widget.</span>
|
|
<span class="sd"> </span>
|
|
<span class="sd"> :return: The rendered JS code enclosed inside ``<script>`` block.</span>
|
|
<span class="sd"> :rtype: :py:obj:`unicode`</span>
|
|
<span class="sd"> """</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''</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">"""</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 ``<script>`` block.</span>
|
|
<span class="sd"> :rtype: :py:obj:`unicode`</span>
|
|
<span class="sd"> """</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'$("#</span><span class="si">%s</span><span class="s">").select2(</span><span class="si">%s</span><span class="s">);'</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">"""</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"> """</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">'id'</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">"Generated widget code:-</span><span class="se">\n</span><span class="si">%s</span><span class="s">"</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">'screen'</span><span class="p">:</span> <span class="p">(</span><span class="s">'css/select2.css'</span><span class="p">,</span> <span class="s">'css/extra.css'</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">"""</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"> """</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">'multiple'</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">''</span><span class="p">,</span> <span class="s">''</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">"""</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"> """</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">'multiple'</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">'allowClear'</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">'minimumResultsForSearch'</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">"""</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"> """</span>
|
|
<span class="n">input_type</span> <span class="o">=</span> <span class="s">'hidden'</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">'multiple'</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""</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">'id'</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''</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"$('#</span><span class="si">%s</span><span class="s">').val(django_select2.convertArrToStr(</span><span class="si">%s</span><span class="s">));"</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"django_select2.initMultipleHidden($('#</span><span class="si">%s</span><span class="s">'));"</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">"""</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('django_select2.onInit')``</span>
|
|
<span class="sd"> * ajax:</span>
|
|
<span class="sd"> * dataType: ``'json'``</span>
|
|
<span class="sd"> * quietMillis: ``100``</span>
|
|
<span class="sd"> * data: ``JSFunctionInContext('django_select2.get_url_params')``</span>
|
|
<span class="sd"> * results: ``JSFunctionInContext('django_select2.process_results')``</span>
|
|
|
|
<span class="sd"> .. tip:: You can override these options by passing ``select2_options`` kwarg to :py:meth:`.__init__`.</span>
|
|
<span class="sd"> """</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">"""</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'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, 'Label1'), (val2, 'Label2'), ...]``.</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"> """</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">'data_view'</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">'data_url'</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">'userGetValTextFuncName'</span><span class="p">,</span> <span class="s">u'null'</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">'choices'</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">'data_view or data_url is required'</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">'ajax'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s">'dataType'</span><span class="p">:</span> <span class="s">'json'</span><span class="p">,</span>
|
|
<span class="s">'quietMillis'</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
|
|
<span class="s">'data'</span><span class="p">:</span> <span class="n">JSFunctionInContext</span><span class="p">(</span><span class="s">'django_select2.get_url_params'</span><span class="p">),</span>
|
|
<span class="s">'results'</span><span class="p">:</span> <span class="n">JSFunctionInContext</span><span class="p">(</span><span class="s">'django_select2.process_results'</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">'minimumInputLength'</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">'initSelection'</span><span class="p">]</span> <span class="o">=</span> <span class="n">JSFunction</span><span class="p">(</span><span class="s">'django_select2.onInit'</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">"""</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' 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"> """</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">'_get_val_txt'</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">'ajax'</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'url'</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">'ajax'</span><span class="p">][</span><span class="s">'url'</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">"""</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'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"> """</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"$('#</span><span class="si">%s</span><span class="s">').txt(</span><span class="si">%s</span><span class="s">);"</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"$('#</span><span class="si">%s</span><span class="s">').change(django_select2.onValChange).data('userGetValText', </span><span class="si">%s</span><span class="s">);"</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">'js/heavy_data.js'</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">'screen'</span><span class="p">:</span> <span class="p">(</span><span class="s">'css/select2.css'</span><span class="p">,</span> <span class="s">'css/extra.css'</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">"""</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"> """</span>
|
|
|
|
<span class="n">input_type</span> <span class="o">=</span> <span class="s">'hidden'</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">'multiple'</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">"""</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('django_select2.MULTISEPARATOR')``</span>
|
|
|
|
<span class="sd"> """</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">'multiple'</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">'allowClear'</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">'minimumResultsForSearch'</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">'separator'</span><span class="p">]</span> <span class="o">=</span> <span class="n">JSVar</span><span class="p">(</span><span class="s">'django_select2.MULTISEPARATOR'</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">"""</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'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"> """</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"$('#</span><span class="si">%s</span><span class="s">').txt(</span><span class="si">%s</span><span class="s">);"</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">"""</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'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'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"> """</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"$('#</span><span class="si">%s</span><span class="s">').data('field_id', '</span><span class="si">%s</span><span class="s">');"</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">"Auto version of :py:class:`.HeavySelect2Widget`"</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">"Auto version of :py:class:`.HeavySelect2MultipleWidget`"</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> »</li>
|
|
<li><a href="../index.html" >Module code</a> »</li>
|
|
</ul>
|
|
</div>
|
|
<div class="footer">
|
|
© Copyright 2012, Nirupam Biswas.
|
|
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
|
</div>
|
|
</body>
|
|
</html> |