Index: django/db/models/base.py
===================================================================
--- django/db/models/base.py	(revision 13301)
+++ django/db/models/base.py	(working copy)
@@ -647,9 +647,15 @@
     def _get_next_or_previous_by_FIELD(self, field, is_next, **kwargs):
         op = is_next and 'gt' or 'lt'
         order = not is_next and '-' or ''
-        param = smart_str(getattr(self, field.attname))
-        q = Q(**{'%s__%s' % (field.name, op): param})
-        q = q|Q(**{field.name: param, 'pk__%s' % op: self.pk})
+
+        current_field_value = getattr(self, field.attname)
+        if current_field_value is None:
+            q = Q(**{ "%s__isnull" % field.name: True, 'pk__%s' % op: self.pk})
+        else:
+            param = smart_str(current_field_value)
+            q = Q(**{'%s__%s' % (field.name, op): param})
+            q = q|Q(**{field.name: param, 'pk__%s' % op: self.pk})
+
         qs = self.__class__._default_manager.using(self._state.db).filter(**kwargs).filter(q).order_by('%s%s' % (order, field.name), '%spk' % order)
         try:
             return qs[0]
Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 13301)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -627,11 +627,10 @@
 
     def contribute_to_class(self, cls, name):
         super(DateField,self).contribute_to_class(cls, name)
-        if not self.null:
-            setattr(cls, 'get_next_by_%s' % self.name,
-                curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=True))
-            setattr(cls, 'get_previous_by_%s' % self.name,
-                curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=False))
+        setattr(cls, 'get_next_by_%s' % self.name,
+            curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=True))
+        setattr(cls, 'get_previous_by_%s' % self.name,
+            curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=False))
 
     def get_prep_lookup(self, lookup_type, value):
         # For "__month", "__day", and "__week_day" lookups, convert the value
Index: tests/modeltests/lookup/models.py
===================================================================
--- tests/modeltests/lookup/models.py	(revision 13301)
+++ tests/modeltests/lookup/models.py	(working copy)
@@ -9,7 +9,7 @@
 
 class Article(models.Model):
     headline = models.CharField(max_length=100)
-    pub_date = models.DateTimeField()
+    pub_date = models.DateTimeField(null=True)
     class Meta:
         ordering = ('-pub_date', 'headline')
 
@@ -223,6 +223,12 @@
 # get_previous_by_FOO() methods.
 # In the case of identical date values, these methods will use the ID as a
 # fallback check. This guarantees that no records are skipped or duplicated.
+
+>>> a8 = Article(headline='Article 8', pub_date=None)
+>>> a8.save()
+>>> a9 = Article(headline='Article 9', pub_date=None)
+>>> a9.save()
+
 >>> a1.get_next_by_pub_date()
 <Article: Article 2>
 >>> a2.get_next_by_pub_date()
@@ -255,6 +261,35 @@
 >>> a2.get_previous_by_pub_date()
 <Article: Article 1>
 
+# test walking around in null land:
+
+# go from first null date to 2nd null date and back
+>>> a8.get_next_by_pub_date()
+<Article: Article 9>
+>>> a9.get_previous_by_pub_date()
+<Article: Article 8>
+
+# try to go past first/last null date 
+a9.get_next_by_pub_date()
+>>> a8.get_previous_by_pub_date()
+Traceback (most recent call last):
+    ...
+DoesNotExist: Article matching query does not exist.
+>>> a9.get_next_by_pub_date()
+Traceback (most recent call last):
+    ...
+DoesNotExist: Article matching query does not exist.
+
+# try to go from first date up into nulls (which SQL ORDER BY puts before values)
+>>> a1.get_previous_by_pub_date()
+Traceback (most recent call last):
+    ...
+DoesNotExist: Article matching query does not exist.
+
+# because I don't feel like modifying the rest of the tests:
+>>> a8.delete()
+>>> a9.delete()
+
 # Underscores and percent signs have special meaning in the underlying
 # SQL code, but Django handles the quoting of them automatically.
 >>> a8 = Article(headline='Article_ with underscore', pub_date=datetime(2005, 11, 20))
