Author: zain
Date: 2009-12-20 22:46:58 -0600 (Sun, 20 Dec 2009)
New Revision: 11928

Modified:
   
django/branches/soc2009/admin-ui/django/contrib/admin/templates/widget/m2m_searchinput.html
   django/branches/soc2009/admin-ui/django/contrib/admin/widgets.py
Log:
[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



Modified: 
django/branches/soc2009/admin-ui/django/contrib/admin/templates/widget/m2m_searchinput.html
===================================================================
--- 
django/branches/soc2009/admin-ui/django/contrib/admin/templates/widget/m2m_searchinput.html
 2009-12-21 03:39:00 UTC (rev 11927)
+++ 
django/branches/soc2009/admin-ui/django/contrib/admin/templates/widget/m2m_searchinput.html
 2009-12-21 04:46:58 UTC (rev 11928)
@@ -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();

Modified: django/branches/soc2009/admin-ui/django/contrib/admin/widgets.py
===================================================================
--- django/branches/soc2009/admin-ui/django/contrib/admin/widgets.py    
2009-12-21 03:39:00 UTC (rev 11927)
+++ django/branches/soc2009/admin-ui/django/contrib/admin/widgets.py    
2009-12-21 04:46:58 UTC (rev 11928)
@@ -289,10 +289,10 @@
         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 @@
     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):

--

You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.


Reply via email to