Index: django/forms/forms.py
===================================================================
--- django/forms/forms.py	(revision 10585)
+++ django/forms/forms.py	(working copy)
@@ -387,6 +387,19 @@
             name = self.html_initial_name
         return widget.render(name, data, attrs=attrs)
 
+    def as_widget_js_value(self, widget=None, attrs=None, only_initial=False):
+        if not widget:
+            widget = self.field.widget
+        attrs = attrs or {}
+        auto_id = self.auto_id
+        if auto_id and 'id' not in attrs and 'id' not in widget.attrs:
+            attrs['id'] = auto_id
+        if not only_initial:
+            name = self.html_name
+        else:
+            name = self.html_initial_name
+        return widget.js_value(name, attrs=attrs)
+
     def as_text(self, attrs=None, **kwargs):
         """
         Returns a string of HTML for representing this as an <input type="text">.
Index: django/forms/widgets.py
===================================================================
--- django/forms/widgets.py	(revision 10585)
+++ django/forms/widgets.py	(working copy)
@@ -631,6 +631,18 @@
             output.append(widget.render(name + '_%s' % i, widget_value, final_attrs))
         return mark_safe(self.format_output(output))
 
+    def js_value(self, name, attrs=None):
+        widget_values = []
+        final_attrs = self.build_attrs(attrs)
+        id_ = final_attrs.get('id', None)
+        for i, widget in enumerate(self.widgets):
+            if id_:
+                widget_id = '%s_%s' % (id_, i)
+            else:
+                widget_id = name + '_%s' % i
+            widget_values.append('document.getElementById("%s").value' % widget_id)
+        return ' + " " + '.join(widget_values)
+
     def id_for_label(self, id_):
         # See the comment for RadioSelect.id_for_label()
         if id_:
@@ -699,6 +711,21 @@
             return [value.date(), value.time().replace(microsecond=0)]
         return [None, None]
 
+    def js_value(self, name, attrs=None):
+        widget_values = []
+        final_attrs = self.build_attrs(attrs)
+        id_ = final_attrs.get('id', None)
+        for i, widget in enumerate(self.widgets):
+            if id_:
+                widget_id = '%s_%s' % (id_, i)
+            else:
+                widget_id = name + '_%s' % i
+            if isinstance(widget, TimeInput):
+                widget_values.append('document.getElementById("%s").value.replace(/:/g, "-")' % widget_id)
+            else:
+                widget_values.append('document.getElementById("%s").value' % widget_id)
+        return ' + " " + '.join(widget_values)
+
 class SplitHiddenDateTimeWidget(SplitDateTimeWidget):
     """
     A Widget that splits datetime input into two <input type="hidden"> inputs.
Index: django/contrib/admin/media/js/core.js
===================================================================
--- django/contrib/admin/media/js/core.js	(revision 10585)
+++ django/contrib/admin/media/js/core.js	(working copy)
@@ -29,6 +29,17 @@
     }
 }
 
+function fireEvent(obj, evType) {
+    if(document.createEvent) {
+        var evObj = document.createEvent('HTMLEvents');
+        evObj.initEvent(evType, true, false);
+        obj.dispatchEvent(evObj);
+    }
+    else if(document.createEventObject) {
+        obj.fireEvent('on' + evType);
+    }
+}
+
 // quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
 function quickElement() {
     var obj = document.createElement(arguments[0]);
Index: django/contrib/admin/media/js/admin/DateTimeShortcuts.js
===================================================================
--- django/contrib/admin/media/js/admin/DateTimeShortcuts.js	(revision 10585)
+++ django/contrib/admin/media/js/admin/DateTimeShortcuts.js	(working copy)
@@ -116,8 +116,10 @@
        window.document.onclick = null;
     },
     handleClockQuicklink: function(num, val) {
-       DateTimeShortcuts.clockInputs[num].value = val;
-       DateTimeShortcuts.dismissClock(num);
+        var elem = DateTimeShortcuts.clockInputs[num];
+        elem.value = val;
+        fireEvent(elem, 'keyup');
+        DateTimeShortcuts.dismissClock(num);
     },
     // Add calendar widget to a given field.
     addCalendar: function(inp) {
@@ -237,12 +239,14 @@
         DateTimeShortcuts.calendars[num].drawNextMonth();
     },
     handleCalendarCallback: function(num) {
-        return "function(y, m, d) { DateTimeShortcuts.calendarInputs["+num+"].value = y+'-'+(m<10?'0':'')+m+'-'+(d<10?'0':'')+d; document.getElementById(DateTimeShortcuts.calendarDivName1+"+num+").style.display='none';}";
+        return "function(y, m, d) { var elem = DateTimeShortcuts.calendarInputs[" + num + "]; elem.value = y+'-'+(m<10?'0':'')+m+'-'+(d<10?'0':'')+d; document.getElementById(DateTimeShortcuts.calendarDivName1+" + num + ").style.display='none'; fireEvent(elem, 'keyup');}";
     },
     handleCalendarQuickLink: function(num, offset) {
        var d = new Date();
-       d.setDate(d.getDate() + offset)
-       DateTimeShortcuts.calendarInputs[num].value = d.getISODate();
+       d.setDate(d.getDate() + offset);
+       var elem = DateTimeShortcuts.calendarInputs[num];
+       elem.value = d.getISODate();
+       fireEvent(elem, 'keyup');
        DateTimeShortcuts.dismissCalendar(num);
     },
     cancelEventPropagation: function(e) {
Index: django/contrib/admin/widgets.py
===================================================================
--- django/contrib/admin/widgets.py	(revision 10585)
+++ django/contrib/admin/widgets.py	(working copy)
@@ -70,6 +70,21 @@
         return mark_safe(u'<p class="datetime">%s %s<br />%s %s</p>' % \
             (_('Date:'), rendered_widgets[0], _('Time:'), rendered_widgets[1]))
 
+    def js_value(self, name, attrs=None):
+        widget_values = []
+        final_attrs = self.build_attrs(attrs)
+        id_ = final_attrs.get('id', None)
+        for i, widget in enumerate(self.widgets):
+            if id_:
+                widget_id = '%s_%s' % (id_, i)
+            else:
+                widget_id = name + '_%s' % i
+            if isinstance(widget, AdminTimeWidget):
+                widget_values.append('document.getElementById("%s").value.replace(/:/g, "-")' % widget_id)
+            else:
+                widget_values.append('document.getElementById("%s").value' % widget_id)
+        return ' + " " + '.join(widget_values)
+
 class AdminRadioFieldRenderer(RadioFieldRenderer):
     def render(self):
         """Outputs a <ul> for this set of radio fields."""
Index: django/contrib/admin/templates/admin/prepopulated_fields_js.html
===================================================================
--- django/contrib/admin/templates/admin/prepopulated_fields_js.html	(revision 10585)
+++ django/contrib/admin/templates/admin/prepopulated_fields_js.html	(working copy)
@@ -1,3 +1,4 @@
+{% autoescape off %}
 <script type="text/javascript">
 {% for field in prepopulated_fields %}
     document.getElementById("{{ field.field.auto_id }}").onchange = function() { this._changed = true; };
@@ -2,8 +3,23 @@
     {% for dependency in field.dependencies %}
-    document.getElementById("{{ dependency.auto_id }}").onkeyup = function() {
-        var e = document.getElementById("{{ field.field.auto_id }}");
-        if (!e._changed) { e.value = URLify({% for innerdep in field.dependencies %}document.getElementById("{{ innerdep.auto_id }}").value{% if not forloop.last %} + ' ' + {% endif %}{% endfor %}, {{ field.field.field.max_length|default_if_none:"50" }}); }
-    }
+        {% if dependency.field.widget.widgets %}
+            {% comment %} widget is a MultiWidget {% endcomment %}
+            {% for widget in dependency.field.widget.widgets %}
+                document.getElementById("{{ dependency.auto_id }}_{{ forloop.counter0 }}").onkeyup = function() {
+                    var e = document.getElementById("{{ field.field.auto_id }}");
+                    if (!e._changed) {
+                        e.value = URLify({% for innerdep in field.dependencies %}{{ innerdep.as_widget_js_value }}{% if not forloop.last %} + ' ' + {% endif %}{% endfor %}, {{ field.field.field.max_length|default_if_none:"50" }});
+                    }
+                }
+            {% endfor %}
+        {% else %}
+            document.getElementById("{{ dependency.auto_id }}").onkeyup = function() {
+                var e = document.getElementById("{{ field.field.auto_id }}");
+                if (!e._changed) {
+                    e.value = URLify({% for innerdep in field.dependencies %}document.getElementById("{{ innerdep.auto_id }}").value{% if not forloop.last %} + ' ' + {% endif %}{% endfor %}, {{ field.field.field.max_length|default_if_none:"50" }});
+                }
+            }
+        {% endif %}
     {% endfor %}
 {% endfor %}
 </script>
+{% endautoescape %}
\ No newline at end of file
