Index: django/forms/models.py
===================================================================
--- django/forms/models.py	(revisión: 7972)
+++ django/forms/models.py	(copia de trabajo)
@@ -230,7 +230,11 @@
 
         if 'media' not in attrs:
             new_class.media = media_property(new_class)
-        declared_fields = get_declared_fields(bases, attrs, False)
+        if attrs.has_key('declared_fields'):
+            declared_fields = attrs['declared_fields']
+        else:
+            declared_fields = SortedDict()
+        declared_fields.update(get_declared_fields(bases, attrs, False))
         opts = new_class._meta = ModelFormOptions(getattr(new_class, 'Meta', None))
         if opts.model:
             # If a model is defined, extract form fields from it.
Index: django/forms/forms.py
===================================================================
--- django/forms/forms.py	(revisión: 7972)
+++ django/forms/forms.py	(copia de trabajo)
@@ -56,7 +56,9 @@
     'base_fields', taking into account parent class 'base_fields' as well.
     """
     def __new__(cls, name, bases, attrs):
-        attrs['base_fields'] = get_declared_fields(bases, attrs)
+        declared_fields = get_declared_fields(bases, attrs)
+        attrs['declared_fields'] = declared_fields
+        attrs['base_fields'] = declared_fields
         new_class = super(DeclarativeFieldsMetaclass,
                      cls).__new__(cls, name, bases, attrs)
         if 'media' not in attrs:
Index: tests/regressiontests/forms/models.py
===================================================================
--- tests/regressiontests/forms/models.py	(revisión: 7972)
+++ tests/regressiontests/forms/models.py	(copia de trabajo)
@@ -15,10 +15,10 @@
     name = models.CharField(max_length=10)
 
 __test__ = {'API_TESTS': """
->>> from django.forms import form_for_model, form_for_instance
+>>> from django import forms
 
 # Boundary conditions on a PostitiveIntegerField #########################
->>> BoundaryForm = form_for_model(BoundaryModel)
+>>> BoundaryForm = forms.form_for_model(BoundaryModel)
 >>> f = BoundaryForm({'positive_integer':100})
 >>> f.is_valid()
 True
@@ -32,7 +32,7 @@
 # Formfield initial values ########
 If the model has default values for some fields, they are used as the formfield
 initial values.
->>> DefaultsForm = form_for_model(Defaults)
+>>> DefaultsForm = forms.form_for_model(Defaults)
 >>> DefaultsForm().fields['name'].initial
 u'class default value'
 >>> DefaultsForm().fields['def_date'].initial
@@ -43,11 +43,28 @@
 In form_for_instance(), the initial values come from the instance's values, not
 the model's defaults.
 >>> foo_instance = Defaults(name=u'instance value', def_date = datetime.date(1969, 4, 4), value = 12)
->>> InstanceForm = form_for_instance(foo_instance)
+>>> InstanceForm = forms.form_for_instance(foo_instance)
 >>> InstanceForm().fields['name'].initial
 u'instance value'
 >>> InstanceForm().fields['def_date'].initial
 datetime.date(1969, 4, 4)
 >>> InstanceForm().fields['value'].initial
 12
+
+# Regression test for #6926 ##################################################
+
+Make sure hierarchy in metaclasses doesn't miss declared fields
+
+>>> class ExtraFieldForm(forms.Form):
+...     extra_field = forms.CharField()
+
+>>> class ChildForm(ExtraFieldForm, forms.ModelForm):
+...    # this is necessary to avoid python metaclass conflict error
+...    __metaclass__ = type('ChildFormMetaclass', (ExtraFieldForm.__metaclass__, forms.ModelForm.__metaclass__), {})
+...    non_existing_field = forms.CharField()
+...    class Meta:
+...        model = ChoiceModel
+
+>>> ChildForm.base_fields.keys()
+['name', 'extra_field', 'non_existing_field']
 """}
