Index: tests/test_select.py
===================================================================
--- tests/test_select.py	(revision 7791)
+++ tests/test_select.py	(working copy)
@@ -131,6 +131,25 @@
     display = single_form.submit("button")
     assert "<p>You selected 6</p>" in display, display
 
+def test_single_select_forced_value():
+    app = webtest.TestApp(select_app)
+    res = app.get('/')
+    assert res.status_int == 200
+    assert res.headers['content-type'] == 'text/html'
+    assert res.content_type == 'text/html'
+    
+    single_form = res.forms["single_select_form"]
+    assert single_form["single"].value == "5"
+    try:
+        single_form.set("single", "984")
+        assert False, "not-an-option value error should have been raised"
+    except ValueError, exc:
+        pass
+    single_form["single"].force_value("984")
+    assert single_form["single"].value == "984"
+    display = single_form.submit("button")
+    assert "<p>You selected 984</p>" in display, display
+
 def test_single_select_no_default():
     app = webtest.TestApp(select_app_without_default)
     res = app.get('/')
@@ -182,6 +201,27 @@
     display = multiple_form.submit("button")
     assert "<p>You selected 9</p>" in display, display
 
+def test_multiple_select_forced_values():
+    app = webtest.TestApp(select_app)
+    res = app.get('/')
+    assert res.status_int == 200
+    assert res.headers['content-type'] == 'text/html'
+    assert res.content_type == 'text/html'
+    
+    multiple_form = res.forms["multiple_select_form"]
+    assert multiple_form["multiple"].value == ["8", "11"],\
+        multiple_form["multiple"].value
+    try:
+        multiple_form.set("multiple", ["24", "88"])
+        assert False, "not-an-option value error should have been raised"
+    except ValueError, exc:
+        pass
+    multiple_form["multiple"].force_value(["24", "88"])
+    assert multiple_form["multiple"].value == ["24", "88"],\
+        multiple_form["multiple"].value
+    display = multiple_form.submit("button")
+    assert "<p>You selected 24, 88</p>" in display, display
+
 def test_multiple_select_no_default():
     app = webtest.TestApp(select_app_without_default)
     res = app.get('/')
Index: webtest/__init__.py
===================================================================
--- webtest/__init__.py	(revision 7791)
+++ webtest/__init__.py	(working copy)
@@ -1176,6 +1176,9 @@
 
     value = property(value__get, value__set)
 
+class NoValue(object):
+    pass
+
 class Select(Field):
 
     """
@@ -1187,8 +1190,15 @@
         self.options = []
         # Undetermined yet:
         self.selectedIndex = None
-
+        # we have no forced value
+        self._forced_value = NoValue
+    
+    def force_value(self, value):
+        self._forced_value = value
+    
     def value__set(self, value):
+        if self._forced_value is not NoValue:
+            self._forced_value = NoValue
         for i, (option, checked) in enumerate(self.options):
             if option == str(value):
                 self.selectedIndex = i
@@ -1200,7 +1210,9 @@
                 [repr(o) for o, c in self.options])))
 
     def value__get(self):
-        if self.selectedIndex is not None:
+        if self._forced_value is not NoValue:
+            return self._forced_value
+        elif self.selectedIndex is not None:
             return self.options[self.selectedIndex][0]
         else:
             for option, checked in self.options:
@@ -1227,7 +1239,12 @@
         self.options = []
         # Undetermined yet:
         self.selectedIndices = []
-
+        self._forced_values = []
+    
+    def force_value(self, values):
+        self._forced_values = values
+        self.selectedIndices = []
+    
     def value__set(self, values):
         str_values = [str(value) for value in values]
         self.selectedIndicies = []
@@ -1243,18 +1260,20 @@
                         [repr(o) for o, c in self.options])))
 
     def value__get(self):
+        selected_values = []
         if self.selectedIndices:
-            return [self.options[i][0] for i in self.selectedIndices]
-        else:
+            selected_values = [self.options[i][0] for i in self.selectedIndices]
+        elif not self._forced_values:
             selected_values = []
             for option, checked in self.options:
                 if checked:
                     selected_values.append(option)
-                
-            if self.options and (not selected_values):
-                selected_values = None
-            return selected_values
-    
+        if self._forced_values:
+            selected_values += self._forced_values
+        
+        if self.options and (not selected_values):
+            selected_values = None
+        return selected_values
     value = property(value__get, value__set)
 
 Field.classes['multiple_select'] = MultipleSelect

