Index: django/contrib/admin/views/main.py
===================================================================
--- django/contrib/admin/views/main.py	(revision 6702)
+++ django/contrib/admin/views/main.py	(working copy)
@@ -586,7 +586,7 @@
 
     def get_filters(self, request):
         filter_specs = []
-        if self.lookup_opts.admin.list_filter and not self.opts.one_to_one_field:
+        if self.lookup_opts.admin.list_filter: # and not self.opts.one_to_one_field:
             filter_fields = [self.lookup_opts.get_field(field_name) \
                               for field_name in self.lookup_opts.admin.list_filter]
             for f in filter_fields:
Index: django/newforms/models.py
===================================================================
--- django/newforms/models.py	(revision 6702)
+++ django/newforms/models.py	(working copy)
@@ -10,7 +10,7 @@
 from util import ValidationError
 from forms import BaseForm
 from fields import Field, ChoiceField, EMPTY_VALUES
-from widgets import Select, SelectMultiple, MultipleHiddenInput
+from widgets import Select, SelectMultiple, MultipleHiddenInput, ModelSelectMultiple
 
 __all__ = (
     'save_instance', 'form_for_model', 'form_for_instance', 'form_for_fields',
Index: django/newforms/widgets.py
===================================================================
--- django/newforms/widgets.py	(revision 6702)
+++ django/newforms/widgets.py	(working copy)
@@ -13,7 +13,7 @@
 from django.utils.datastructures import MultiValueDict
 from django.utils.html import escape
 from django.utils.translation import ugettext
-from django.utils.encoding import StrAndUnicode, force_unicode
+from django.utils.encoding import StrAndUnicode, force_unicode, smart_unicode
 from django.utils.safestring import mark_safe
 from util import flatatt
 
@@ -250,7 +250,7 @@
         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.
+        str_values = set([self.value_to_str(v) for v in value]) # Normalize to strings.
         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 ''
@@ -262,7 +262,14 @@
         if isinstance(data, MultiValueDict):
             return data.getlist(name)
         return data.get(name, None)
+        
+    def value_to_str(cls, value):
+        return smart_unicode(value)
 
+def ModelSelectMultiple(SelectMultiple):
+    def value_to_str(cls, value):
+        return super(ModelSelectMultiple, cls).value_to_str(value._get_pk_val())
+
 class RadioInput(StrAndUnicode):
     """
     An object used by RadioFieldRenderer that represents a single
