Index: newforms/widgets.py
===================================================================
--- newforms/widgets.py	(revision 6706)
+++ newforms/widgets.py	(working copy)
@@ -250,7 +250,13 @@
         if value is None: value = []
         final_attrs = self.build_attrs(attrs, name=name)
         output = [u'<select multiple="multiple"%s>' % flatatt(final_attrs)]
-        str_values = set([force_unicode(v) for v in value]) # Normalize to strings.
+        # Normalize to strings
+        str_values = set()
+        for v in value:
+            if hasattr(v, '_get_pk_val'):
+                str_values.add(force_unicode(v._get_pk_val()))
+            else:
+                str_values.add(force_unicode(v))
         for option_value, option_label in chain(self.choices, choices):
             option_value = force_unicode(option_value)
             selected_html = (option_value in str_values) and ' selected="selected"' or ''
@@ -352,7 +358,12 @@
         final_attrs = self.build_attrs(attrs, name=name)
         output = [u'<ul>']
         # Normalize to strings
-        str_values = set([force_unicode(v) for v in value])
+        str_values = set()
+        for v in value:
+            if hasattr(v, '_get_pk_val'):
+                str_values.add(force_unicode(v._get_pk_val()))
+            else:
+                str_values.add(force_unicode(v))
         for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
             # If an ID attribute was given, add a numeric index as a suffix,
             # so that the checkboxes don't all have the same ID attribute.
