diff options
author | Zain Memon <zain@inzain.net> | 2009-12-21 04:46:58 +0000 |
---|---|---|
committer | Zain Memon <zain@inzain.net> | 2009-12-21 04:46:58 +0000 |
commit | 911b0b4348d5ade5cbbe73ad3a06b67ca519b2d8 (patch) | |
tree | 6fc81d6c81ee2e039a10a6aa1d879e04a063fb2f | |
parent | 9831258985cfee682a4f77c7bf7fc390ae35712b (diff) | |
download | django-911b0b4348d5ade5cbbe73ad3a06b67ca519b2d8.tar.gz |
[gsoc2009/admin-ui] Refactored the m2m token input view a bit to make it cleaner, and now properly prepopulating data for the m2m token input widget
git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/admin-ui@11928 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r-- | django/contrib/admin/templates/widget/m2m_searchinput.html | 8 | ||||
-rw-r--r-- | django/contrib/admin/widgets.py | 44 |
2 files changed, 27 insertions, 25 deletions
diff --git a/django/contrib/admin/templates/widget/m2m_searchinput.html b/django/contrib/admin/templates/widget/m2m_searchinput.html index 145731a970..68a34ce02b 100644 --- a/django/contrib/admin/templates/widget/m2m_searchinput.html +++ b/django/contrib/admin/templates/widget/m2m_searchinput.html @@ -4,9 +4,15 @@ </a> <script type="text/javascript"> $(document).ready(function() { + $('#id_{{ name }}').val(''); $('#id_{{ name }}').tokenInput("{{ search_path }}", { noResultsText: "No results found.", - searchingText: "Searching..." + searchingText: "Searching...", + prePopulate: [ + {% for p in prepopulated_data %} + {id: {{ p.id }}, name: "{{ p.name }}"}, + {% endfor %} + ] }); $('#add_id_{{ name }}').hide(); diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py index dc16215c9c..dc31dc34c3 100644 --- a/django/contrib/admin/widgets.py +++ b/django/contrib/admin/widgets.py @@ -289,10 +289,10 @@ class ManyToManySearchInput(ManyToManyRawIdWidget): self.search_fields = search_fields super(ManyToManySearchInput, self).__init__(rel, attrs) - def label_for_value(self, value): + def prepopulated_data_for_value(self, value): key = self.rel.get_related_field().name - objs = self.rel.to._default_manager.filter(**{key + '__in': value.split(',')}) - return ','.join([str(o) for o in objs]) + objs = self.rel.to._default_manager.filter(**{key + '__in': value}) + return [{'id': o.id, 'name': unicode(o)} for o in objs] def get_search_path(self, name): return '../autocomplete/%s/' % name @@ -300,45 +300,41 @@ class ManyToManySearchInput(ManyToManyRawIdWidget): def render(self, name, value, attrs=None): if attrs is None: attrs = {} - output = [super(ManyToManySearchInput, self).render(name, value, attrs)] - if value: - value = ','.join([str(v) for v in value]) - else: - value = '' - opts = self.rel.to._meta - app_label = opts.app_label - model_name = opts.object_name.lower() - related_url = '../../../%s/%s/' % (app_label, model_name) + if not attrs.has_key('class'): + attrs['class'] = 'vM2MRawIdAdminField' + + if not value: + value = [] + params = self.url_parameters() if params: url = '?' + '&'.join(['%s=%s' % (k, v) for k, v in params.items()]) else: url = '' - if not attrs.has_key('class'): - attrs['class'] = 'vM2MRawIdAdminField' - # Call the TextInput render method directly to have more control - output = [forms.TextInput.render(self, name, value, attrs)] - if value: - label = self.label_for_value(value) - else: - label = u'' + + output = [forms.TextInput.render(self, name, ','.join([str(v) for v in value]), attrs)] + opts = self.rel.to._meta + context = { 'url': url, - 'related_url': related_url, + 'related_url': '../../../%s/%s/' % (opts.app_label, opts.object_name.lower()), 'admin_media_prefix': settings.ADMIN_MEDIA_PREFIX, 'search_path': self.get_search_path(name), 'search_fields': ','.join(self.search_fields), - 'model_name': model_name, - 'app_label': app_label, - 'label': label, 'name': name, + 'model_name': opts.object_name.lower(), + 'app_label': opts.app_label, + 'prepopulated_data': self.prepopulated_data_for_value(value), } + output.append(render_to_string(self.widget_template or ( 'templates/widget/%s/%s/m2m_searchinput.html' % (app_label, model_name), 'templates/widget/%s/m2m_searchinput.html' % app_label, 'templates/widget/m2m_searchinput.html', ), context)) + output.reverse() + return mark_safe(u''.join(output)) class RelatedFieldWidgetWrapper(forms.Widget): |