Index: django/forms/models.py
===================================================================
--- django/forms/models.py	(revision 8992)
+++ django/forms/models.py	(working copy)
@@ -134,10 +134,12 @@
     fields will be excluded from the returned fields, even if they are listed
     in the ``fields`` argument.
     """
-    # TODO: if fields is provided, it would be nice to return fields in that order
+
     field_list = []
     opts = model._meta
-    for f in opts.fields + opts.many_to_many:
+    model_fields = opts.fields + opts.many_to_many
+    model_fields.sort()
+    for f in model_fields:
         if not f.editable:
             continue
         if fields and not f.name in fields:
Index: tests/modeltests/model_forms/models.py
===================================================================
--- tests/modeltests/model_forms/models.py	(revision 8992)
+++ tests/modeltests/model_forms/models.py	(working copy)
@@ -236,7 +236,7 @@
 OddForm is now an Article-related thing, because BadForm.Meta overrides
 CategoryForm.Meta.
 >>> OddForm.base_fields.keys()
-['headline', 'slug', 'pub_date', 'writer', 'article', 'status', 'categories']
+['headline', 'slug', 'pub_date', 'writer', 'article', 'categories', 'status']
 
 >>> class ArticleForm(ModelForm):
 ...     class Meta:
@@ -247,7 +247,7 @@
 >>> class BadForm(ArticleForm, CategoryForm):
 ...     pass
 >>> OddForm.base_fields.keys()
-['headline', 'slug', 'pub_date', 'writer', 'article', 'status', 'categories']
+['headline', 'slug', 'pub_date', 'writer', 'article', 'categories', 'status']
 
 Subclassing without specifying a Meta on the class will use the parent's Meta
 (or the first parent in the MRO if there are multiple parent classes).
@@ -398,17 +398,17 @@
 <option value="2">Bob Woodward</option>
 </select></td></tr>
 <tr><th>Article:</th><td><textarea rows="10" cols="40" name="article"></textarea></td></tr>
+<tr><th>Categories:</th><td><select multiple="multiple" name="categories">
+<option value="1">Entertainment</option>
+<option value="2">It&#39;s a test</option>
+<option value="3">Third test</option>
+</select><br /> Hold down "Control", or "Command" on a Mac, to select more than one.</td></tr>
 <tr><th>Status:</th><td><select name="status">
 <option value="" selected="selected">---------</option>
 <option value="1">Draft</option>
 <option value="2">Pending</option>
 <option value="3">Live</option>
 </select></td></tr>
-<tr><th>Categories:</th><td><select multiple="multiple" name="categories">
-<option value="1">Entertainment</option>
-<option value="2">It&#39;s a test</option>
-<option value="3">Third test</option>
-</select><br /> Hold down "Control", or "Command" on a Mac, to select more than one.</td></tr>
 
 You can restrict a form to a subset of the complete list of fields
 by providing a 'fields' argument. If you try to save a
@@ -453,17 +453,17 @@
 <option value="2">Bob Woodward</option>
 </select></li>
 <li>Article: <textarea rows="10" cols="40" name="article">Hello.</textarea></li>
+<li>Categories: <select multiple="multiple" name="categories">
+<option value="1">Entertainment</option>
+<option value="2">It&#39;s a test</option>
+<option value="3">Third test</option>
+</select>  Hold down "Control", or "Command" on a Mac, to select more than one.</li>
 <li>Status: <select name="status">
 <option value="" selected="selected">---------</option>
 <option value="1">Draft</option>
 <option value="2">Pending</option>
 <option value="3">Live</option>
 </select></li>
-<li>Categories: <select multiple="multiple" name="categories">
-<option value="1">Entertainment</option>
-<option value="2">It&#39;s a test</option>
-<option value="3">Third test</option>
-</select>  Hold down "Control", or "Command" on a Mac, to select more than one.</li>
 >>> f = TestArticleForm({'headline': u'Test headline', 'slug': 'test-headline', 'pub_date': u'1984-02-06', 'writer': u'1', 'article': 'Hello.'}, instance=art)
 >>> f.is_valid()
 True
@@ -514,17 +514,17 @@
 <option value="2">Bob Woodward</option>
 </select></li>
 <li>Article: <textarea rows="10" cols="40" name="article">Hello.</textarea></li>
+<li>Categories: <select multiple="multiple" name="categories">
+<option value="1" selected="selected">Entertainment</option>
+<option value="2">It&#39;s a test</option>
+<option value="3">Third test</option>
+</select>  Hold down "Control", or "Command" on a Mac, to select more than one.</li>
 <li>Status: <select name="status">
 <option value="" selected="selected">---------</option>
 <option value="1">Draft</option>
 <option value="2">Pending</option>
 <option value="3">Live</option>
 </select></li>
-<li>Categories: <select multiple="multiple" name="categories">
-<option value="1" selected="selected">Entertainment</option>
-<option value="2">It&#39;s a test</option>
-<option value="3">Third test</option>
-</select>  Hold down "Control", or "Command" on a Mac, to select more than one.</li>
 
 >>> f = TestArticleForm({'headline': u'New headline', 'slug': u'new-headline', 'pub_date': u'1988-01-04',
 ...     'writer': u'1', 'article': u'Hello.', 'categories': [u'1', u'2']}, instance=new_art)
@@ -630,17 +630,17 @@
 <option value="2">Bob Woodward</option>
 </select></li>
 <li>Article: <textarea rows="10" cols="40" name="article"></textarea></li>
+<li>Categories: <select multiple="multiple" name="categories">
+<option value="1">Entertainment</option>
+<option value="2">It&#39;s a test</option>
+<option value="3">Third</option>
+</select>  Hold down "Control", or "Command" on a Mac, to select more than one.</li>
 <li>Status: <select name="status">
 <option value="" selected="selected">---------</option>
 <option value="1">Draft</option>
 <option value="2">Pending</option>
 <option value="3">Live</option>
 </select></li>
-<li>Categories: <select multiple="multiple" name="categories">
-<option value="1">Entertainment</option>
-<option value="2">It&#39;s a test</option>
-<option value="3">Third</option>
-</select>  Hold down "Control", or "Command" on a Mac, to select more than one.</li>
 >>> Category.objects.create(name='Fourth', url='4th')
 <Category: Fourth>
 >>> Writer.objects.create(name='Carl Bernstein')
@@ -656,18 +656,18 @@
 <option value="3">Carl Bernstein</option>
 </select></li>
 <li>Article: <textarea rows="10" cols="40" name="article"></textarea></li>
+<li>Categories: <select multiple="multiple" name="categories">
+<option value="1">Entertainment</option>
+<option value="2">It&#39;s a test</option>
+<option value="3">Third</option>
+<option value="4">Fourth</option>
+</select>  Hold down "Control", or "Command" on a Mac, to select more than one.</li>
 <li>Status: <select name="status">
 <option value="" selected="selected">---------</option>
 <option value="1">Draft</option>
 <option value="2">Pending</option>
 <option value="3">Live</option>
 </select></li>
-<li>Categories: <select multiple="multiple" name="categories">
-<option value="1">Entertainment</option>
-<option value="2">It&#39;s a test</option>
-<option value="3">Third</option>
-<option value="4">Fourth</option>
-</select>  Hold down "Control", or "Command" on a Mac, to select more than one.</li>
 
 # ModelChoiceField ############################################################
 
