Index: django/forms/models.py
===================================================================
--- django/forms/models.py	(revision 9329)
+++ django/forms/models.py	(working copy)
@@ -378,6 +378,46 @@
             self.save_m2m = save_m2m
         return self.save_existing_objects(commit) + self.save_new_objects(commit)
 
+    def clean(self):
+        self.validate_unique()
+
+    def validate_unique(self):
+        from django.db.models.fields import FieldDoesNotExist
+        unique_checks = []
+        for name, field in self.forms[0].fields.iteritems():
+            try:
+                f = self.forms[0].instance._meta.get_field_by_name(name)[0]
+            except FieldDoesNotExist:
+                continue
+            if f.unique:
+                unique_checks.append((name,))
+        unique_together = [check for check
+                in self.forms[0].instance._meta.unique_together
+                if [True for field in check if field in self.forms[0].fields]]
+        unique_checks.extend(unique_together)
+
+        errors = []
+        for unique_check in unique_checks:
+            data = set()
+            for i in xrange(self._total_form_count):
+                form = self.forms[i]
+                if not hasattr(form, 'cleaned_data'):
+                    continue
+                if [True for field in unique_check
+                        if field in form.cleaned_data and form.cleaned_data[field] is not None]:
+                    instance = tuple([form.cleaned_data[field] for field in unique_check])
+                    if instance in data:
+                        if len(unique_check) == 1:
+                            errors.append(_(u"You have entered duplicate data for %(field)s, all %(field)ss should be unique." % { 'field': force_unicode(field), }))
+                        else:
+                            errors.append(_(u"You have entered duplicate data for %(fields)s, %(fields)ss should be unique together." % { 'fields': get_text_list(unique_check, _("and")), }))
+                        break
+                    else:
+                        data.add(instance)
+
+        if errors:
+            raise ValidationError(errors)
+
     def save_existing_objects(self, commit=True):
         self.changed_objects = []
         self.deleted_objects = []
Index: tests/modeltests/model_formsets/models.py
===================================================================
--- tests/modeltests/model_formsets/models.py	(revision 9329)
+++ tests/modeltests/model_formsets/models.py	(working copy)
@@ -792,4 +792,32 @@
 >>> formset.get_queryset()
 [<Player: Bobby>]
 
+# Prevent duplicates from within the same formset
+>>> FormSet = modelformset_factory(Product, extra=2)
+>>> data = {
+...     'form-TOTAL_FORMS': 2,
+...     'form-INITIAL_FORMS': 0,
+...     'form-0-slug': 'red_car',
+...     'form-1-slug': 'red_car',
+... }
+>>> formset = FormSet(data)
+>>> formset.is_valid()
+False
+>>> formset._non_form_errors
+[u'You have entered duplicate data for slug, all slugs should be unique.']
+
+>>> FormSet = modelformset_factory(Price, extra=2)
+>>> data = {
+...     'form-TOTAL_FORMS': 2,
+...     'form-INITIAL_FORMS': 0,
+...     'form-0-price': '25',
+...     'form-0-quantity': '7',
+...     'form-1-price': '25',
+...     'form-1-quantity': '7',
+... }
+>>> formset = FormSet(data)
+>>> formset.is_valid()
+False
+>>> formset._non_form_errors
+[u'You have entered duplicate data for price and quantity, price and quantitys should be unique together.']
 """}
Index: docs/topics/forms/modelforms.txt
===================================================================
--- docs/topics/forms/modelforms.txt	(revision 9329)
+++ docs/topics/forms/modelforms.txt	(working copy)
@@ -538,6 +538,16 @@
 data into the database. This is described above in
 :ref:`saving-objects-in-the-formset`.
 
+Overiding ``clean()`` on a ``model_formset``
+--------------------------------------------
+
+Just like with ``ModelForms``, by default the ``clean()`` method of a 
+``model_formset`` will validate that none of the items in the formset validate 
+the unique constraints on your model(either unique or unique_together).  If you 
+want to overide the ``clean()`` method on a ``model_formset`` and maintain this 
+validation, you must call the parent classes ``clean`` method.
+
+
 Using ``inlineformset_factory``
 -------------------------------
 
