summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZain Memon <zain@inzain.net>2009-12-21 04:46:58 +0000
committerZain Memon <zain@inzain.net>2009-12-21 04:46:58 +0000
commit911b0b4348d5ade5cbbe73ad3a06b67ca519b2d8 (patch)
tree6fc81d6c81ee2e039a10a6aa1d879e04a063fb2f
parent9831258985cfee682a4f77c7bf7fc390ae35712b (diff)
downloaddjango-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.html8
-rw-r--r--django/contrib/admin/widgets.py44
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 = '?' + '&amp;'.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):