Django + Select2 = рд╕реНрд╡рддрдГ рдкреВрд░реНрдг рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ

рд╢реБрдн рджрд┐рдиред


рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВ django рдореЗрдВ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред

рдХрд╛рдлреА рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
рдпрджрд┐ рдЖрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЙрдбрд▓ рдХрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рдорд╛рдирдХ рд╡рд┐рдЬреЗрдЯ (рдЪрдпрди, SelectMultiple) рдХреЗ рд╕рд╛рде рдЪрд▓реЗрдВред
рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред
рдЖрдЗрдП рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬрдм рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред

рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░, рдореБрдЭреЗ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ (рдмрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛)ред
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕реЗрдЯ рд╣реИрдВ рдЬреИрд╕реЗ "рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ" рдпрд╛ "рдпрд╣ рдПрдХ"
рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред

Django рдпреБрдХреНрдд рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдлреИрд▓рд╛рдПрдВ


рдпрд╣ рд▓реЗрдЦ рд╢реБрд░реБрдЖрддреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рд┐рдд рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ django рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХреЛ "рд╡рд┐рдХрд╕рд┐рдд" рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реЛрдЧрд╛ред


рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдПрдХ рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
{% рдореЗрдВ _ form_custom / tree_widget_modal.html тАЩ%} рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдВрджреЗрд╢ рдпрд╛ рдПрдХ рдЕрд▓рдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ред

рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ Select рдФрд░ SelectMultiple рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рдХреНрдпрд╛ рдЪрд┐рдВрддрд╛ рд╣реИред
рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрдИ TextAutocomplete рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрднреА рддрдХ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЙрджрд╛рд╣рд░рдг рд╣реЛрдВрдЧреЗ,
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд┐рдЧреЗрдЯреНрд╕ рдФрд░ рдлрд╛рд░реНрдо рдлрд╝реАрд▓реНрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рд╣реЛрддрд╛ рд╣реИред
рд╡рд┐рдЬреЗрдЯ рд▓реЛрдХрдкреНрд░рд┐рдп Select2 рдкреНрд▓рдЧрдЗрди ivaynberg.imtqy.com/select2 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ

рд╕реНрдерд╛рдкрдирд╛


рд▓рд┐рдкрд┐рдпреЛрдВ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}select2/select2.css"/> <!--    ,        ( ..) --> <script type="text/javascript" src="{{ STATIC_URL }}jquery/jquery.min.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}jstree/jquery.jstree.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}select2/select2.js"></script> <!--      ,   ,     -  --> <script type="text/javascript" src="{{ STATIC_URL }}forms_custom/tree_widget.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}forms_custom/autocomplete.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}forms_custom/autocomplete_multiple.js"></script> 



рдкреИрдХреЗрдЬ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ (рд╕реНрдЯреЗрдЯрд┐рдХреНрд╕ рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП)
рдХрдиреЗрдХреНрдЯ рдХрдиреЗрдХреНрдЯ (AJAX рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдкрд╣реБрдВрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП)
  url(r'^forms_custom/', include('lib.forms_custom.urls', namespace='forms_custom')), 


рдХреЗ рдЙрдкрдпреЛрдЧ


 from django import forms from django.contrib.auth import get_user_model from lib.forms_custom.widgets import SelectMultipleAutocomplete users_active_qs = get_user_model().objects.filter(is_active=True) class MessageCreateForm(forms.Form): recepients = forms.ModelMultipleChoiceField(label=u'', queryset=users_active_qs, widget=SelectMultipleAutocomplete(queryset=users_active_qs, expression="last_name__startswith")) subject = forms.CharField(label=u'', required=False) body = forms.CharField(label=u'', required=False, widget=forms.Textarea) back_url = forms.CharField(widget=forms.HiddenInput) 

рд╡рд┐рдЬреЗрдЯ рдХреЛ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП QuerySet рдФрд░ рдЦреЛрдЬ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
QuerySet рдкрд░ рд▓рдЧрд╛рдП рдЧрдП рдлрд╝рд┐рд▓реНрдЯрд░ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред

SelectAutocomplete рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ ModelChoiceField рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╡рд┐рдЬреЗрдЯ


рд░реЗрдВрдбрд░ рдореЗрдердб рд╕рдм рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдлреЙрд░реНрдо рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛,
рд╡рд╣ рд╣реИ, рдПрдХ рдЫрд┐рдкреА рд╣реБрдИ рдлрд╝реАрд▓реНрдб рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЙрд╕ рдкрд░ select2 рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ "рд╕реЗрдЯ" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рд╡рд┐рдзрд┐ "value_from_datadict" POST рд╕рд░рдгреА рд╕реЗ рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ,
рдЙрдиреНрд╣реЗрдВ рдзрд░реНрдорд╛рдиреНрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕реНрдХреЗрд▓рд░ рдорд╛рдиреЛрдВ рдХреЛ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА (рдЬреИрд╕рд╛ рдХрд┐ ModelMultipleChoiceField SelectMultiple рд╕реЗ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ),
рдХреНрдпреЛрдВрдХрд┐ select2 рд╕реНрдЯреЛрд░ рдПрдХ рдЫрд┐рдкреЗ рд╣реБрдП рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЙрдорд╛ рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред

рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ, рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рд╕реБрдкрд░рдиреЙрдореНрдкрд▓ рдХрд┐рдП рдЧрдП рдлрд┐рд▓реНрдЯрд░реЛрдВ рдХреЛ рд╡реНрд╣реЗрдиреЛрдб рдХреНрд▓рд╛рд╕ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ,
рдЬреЛ рд╣рдореЗрдВ QuerySet рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ:
  where_node = self._queryset.query.__dict__['where'] where, where_params = where_node.as_sql(connection.ops.quote_name, connection) 


рдХрд╣рд╛рдБ_рдкрд░рдо рд╣рдо рдЕрдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдВ рд╣рдо рдЗрд╕реЗ рдЕрдЬрд╛рдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВ

рд╕реНрд░реЛрдд рдХреЛрдб
 import datetime from django import forms from django.db import connection from django.forms import widgets as widgets_django from django.forms import fields from django.template.loader import render_to_string from django.forms.widgets import HiddenInput import pickle class AutocompleteWidget(object): def _parse_queryset(self): self._application = self._queryset.model.__module__.split('.')[-0] self._model_name = self._queryset.model.__name__ where_node = self._queryset.query.__dict__['where'] where, where_params = where_node.as_sql(connection.ops.quote_name, connection) if where: self._queryset_where = where.replace('"', '\"') self._queryset_where_params = pickle.dumps(where_params) else: self._queryset_where = "" self._queryset_where_params = "" class SelectAutocomplete(widgets_django.Select, AutocompleteWidget): def __init__(self, queryset, attrs=None): super(SelectAutocomplete, self).__init__(attrs) self._queryset = queryset self._parse_queryset() def render(self, name, value, attrs=None, choices=()): application = self._queryset.model.__module__.split('.')[-0] model_name = self._queryset.model.__name__ return render_to_string('forms_custom/autocomplete.html', {'value': value, 'attrs': attrs, 'application': application, 'model_name': model_name, 'expression': 'title__startswith', 'name': name, 'where': self._queryset_where, 'where_params': self._queryset_where_params }) class SelectMultipleAutocomplete(widgets_django.SelectMultiple, AutocompleteWidget): def __init__(self, queryset, attrs=None, expression='title__startswith'): super(SelectMultipleAutocomplete, self).__init__(attrs) self._queryset = queryset self._expression = expression self._parse_queryset() def render(self, name, value, attrs=None, choices=()): return render_to_string('forms_custom/autocomplete_multiple.html', {'value': value, 'attrs': attrs, 'application': self._application, 'model_name': self._model_name, 'expression': self._expression, 'name': name, 'where': self._queryset_where, 'where_params': self._queryset_where_params }) def value_from_datadict(self, data, files, name): """ replace scalar value ("1,2,3") to list ([1,2,3])""" data_dict = super(SelectMultipleAutocomplete, self).value_from_datadict(data, files, name) value = data_dict[0] if not value: return None return value.split(",") 



рдлрд╛рд░реНрдо рдореЗрдВ рдлреАрд▓реНрдб


рд╣рдореЗрдВ рд╡рд╣ рдлрд╝реАрд▓реНрдб рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ Select2 рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рдбреЗрдЯрд╛ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ
 <input type="hidden" id="{{attrs.id}}" class="autocomplete_multiple_widget" value="{% if value %}{{value|join:","}}{% endif %}" name="{{name}}" data-url="{% url 'forms_custom:autocomplete_widget' application=application model_name=model_name %}" data-expression="{{expression}}" data-where="{{where}}" data-where_params="{{where_params}}"/> 


рд▓рд┐рдкрд┐


рд╣рдо рд╕реНрд╡рддрдГ рдкреВрд░реНрдг_рдореВрд▓рдХ_рдкреЗрдЧреЗрдЯ рд╡рд░реНрдЧ рдореЗрдВ рд╡рд┐рдЬреЗрдЯ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП select2 рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ
рд╡рд┐рдЬреЗрдЯ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рд╡рд┐рдЬреЗрдЯ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
id__in = current_values

рд╕реНрд░реЛрдд рдХреЛрдб
 $(document).ready(function() { $('.autocomplete_multiple_widget').each(function() { bind_autocomplete_multiple_widget(this); }); }); function bind_autocomplete_multiple_widget(element) { var j_element = $(element); url = j_element.attr('data-url'); var expression = j_element.attr('data-expression'); var where = j_element.attr('data-where'); var where_params = j_element.attr('data-where_params'); $(element).select2({ placeholder: " ", minimumInputLength: 3, multiple: true, ajax: { url: url, quietMillis: 1000, //  1    ,    dataType: 'json', //  GET-    ,   where    data: function (term, page) { return {q: term, expression: expression, where: where, where_params: where_params}; }, results: function (data, page) { return {results: data}; } }, //       //        id (   value="1,2,3"   ) //         id__in=current_values   callback   initSelection: function(element, callback) { var id = $(element).val(); if (id !== "") { $.ajax(url, { data: {q: id, expression: 'pk__in', where: where, where_params: where_params}, dataType: "json" }).done(function(data) { callback(data); }); } }, dropdownCssClass: "bigdrop", escapeMarkup: function (m) { return m; } }); } 



рд╣реИрдВрдбрд▓рд░ рдЦреЛрдЬреЗрдВ


рдЖрд╡реЗрджрди, рдореЙрдбрд▓, QuerySet рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЬрд╛рдХреНрд╕ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ
рдЬрдм рд╡рд┐рдЬреЗрдЯ рдЖрд░рдВрднреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдорд╛рди рдЗрд╕реЗ pk__in = "1,2,3" рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВ
рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рддреЛрдбрд╝рддреЗ рд╣реИрдВред

рд╕реНрд░реЛрдд рдХреЛрдб
 import json import pickle from django.http import HttpResponse, HttpResponseForbidden from django.db.models.loading import get_model def autocomplete_widget(request, application, model_name): if not request.is_ajax(): return HttpResponseForbidden(u'    ajax') data = [] expression = request.GET.get('expression') token = request.GET.get('q') if expression == u'pk__in': token = token.split(",") objects = get_model(application, model_name).objects where = request.GET.get('where') if where: where_params = request.GET.get('where_params') where_params = pickle.loads(where_params) objects = objects.extra(where=[where], params=where_params) objects = objects.filter(**{expression: token})[:20] for item in objects.iterator(): data.append({"id": item.id, "text": unicode(item)}) return HttpResponse(json.dumps(data), content_type="application/json;charset=utf-8") 



рд╣рдо django рдХреИрд╢ рд╕реЗ рдореЙрдбрд▓ рд▓реЗрддреЗ рд╣реИрдВ, рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдФрд░ рдкрд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддреЗ рд╣реИрдВред
рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рд╡рд┐рдЬреЗрдЯ рдерд╛ рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдорд╛рдирдХ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛ (рдпрд╣ рд╣рдЬрд╛рд░реЛрдВ рдЖрдЗрдЯрдореЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ)
рдФрд░ рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд▓реЛрдб рдХреЛ рдХрдо рдХрд░реЗрдВред

drive.google.com/file/d/0B0GZGIoZAYTFNU9xd3dIR3FXU0k/edit?usp=sharing

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдирдП рд╕рд╛рд▓ рдореЗрдВ PS рд╕рдлрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕, рдХрд╛рдорд░реЗрдб!

Source: https://habr.com/ru/post/In207968/


All Articles