Index: django/contrib/localflavor/ca/ca_provinces.py
===================================================================
--- django/contrib/localflavor/ca/ca_provinces.py	(revision 10020)
+++ django/contrib/localflavor/ca/ca_provinces.py	(working copy)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 """ 
 An alphabetical list of provinces and territories for use as `choices` 
 in a formfield., and a mapping of province misspellings/abbreviations to 
@@ -3,6 +4,9 @@
 normalized abbreviations
 
-Source: http://www.canada.gc.ca/othergov/prov_e.html 
+Source: http://www.canadapost.ca/tools/pg/manual/PGaddress-e.asp#1380608
 
+For backwards compatibility reasons, incorrect abbreviations (NF and YK)
+are used for Newfoundland and the Yukon.
+
 This exists in this standalone file so that it's only imported into memory 
 when explicitly needed. 
@@ -27,21 +31,42 @@
 
 PROVINCES_NORMALIZED = {
     'ab': 'AB',
+    'alta': 'AB',
+    'alta.': 'AB',
     'alberta': 'AB',
     'bc': 'BC',
     'b.c.': 'BC',
     'british columbia': 'BC',
+    'colombie-britannique': 'BC',
+    'colombie britannique': 'BC',
+    'cb': 'BC',
+    'c-b': 'BC',
     'mb': 'MB',
     'manitoba': 'MB',
     'nb': 'NB',
     'new brunswick': 'NB',
+    'nouveau-brunswick': 'NB',
+    'nouveau brunswick': 'NB',
     'nf': 'NF',
+    'nl': 'NF',
     'newfoundland': 'NF',
     'newfoundland and labrador': 'NF',
+    'nfld': 'NF',
+    'nfld.': 'NF',
+    'terre-neuve-et-labrador': 'NF',
+    'terre-neuve et labrador': 'NF',
+    'terre-neuve': 'NF',
     'nt': 'NT',
     'northwest territories': 'NT',
+    'territoires du nord-ouest': 'NT',
     'ns': 'NS',
     'nova scotia': 'NS',
+    'nouvelle-écosse': 'NS',
+    'nouvelle-Écosse': 'NS',
+    'nouvelle écosse': 'NS',
+    'nouvelle Écosse': 'NS',
+    'nouvelle-ecosse': 'NS',
+    'nouvelle ecosse': 'NS',
     'nu': 'NU',
     'nunavut': 'NU',
     'on': 'ON',
@@ -50,10 +75,28 @@
     'pei': 'PE',
     'p.e.i.': 'PE',
     'prince edward island': 'PE',
+    'île du prince édouard': 'PE',
+    'Île du prince Édouard': 'PE',
+    'ile du prince edouard': 'PE',
+    'île-du-prince-édouard': 'PE',
+    'Île-du-prince-Édouard': 'PE',
+    'ile-du-prince-edouard': 'PE',
+    'î.p.e.': 'PE',
+    'i.p.e.': 'PE',
     'qc': 'QC',
+    'qu': 'QC',
+    'pq': 'QC',
+    'que': 'QC',
+    'que.': 'QC',
     'quebec': 'QC',
+    'québec': 'QC',
+    'quÉbec': 'QC',
     'sk': 'SK',
     'saskatchewan': 'SK',
+    'sask': 'SK',
+    'sask.': 'SK',
     'yk': 'YK',
+    'yt': 'YK',
     'yukon': 'YK',
-}
\ No newline at end of file
+    'yukon territory': 'YK',
+}
Index: django/contrib/localflavor/ca/forms.py
===================================================================
--- django/contrib/localflavor/ca/forms.py	(revision 10020)
+++ django/contrib/localflavor/ca/forms.py	(working copy)
@@ -20,6 +20,13 @@
     def __init__(self, *args, **kwargs):
         super(CAPostalCodeField, self).__init__(r'^[ABCEGHJKLMNPRSTVXYZ]\d[A-Z] \d[A-Z]\d$',
             max_length=None, min_length=None, *args, **kwargs)
+            
+    def clean(self, value):
+        if value:
+            value = str(value).upper()
+            if len(value) == 6: # Add a space if there isn't one
+                value = value[:3] + ' ' + value[3:]
+        return super(CAPostalCodeField, self).clean(value)
 
 class CAPhoneNumberField(Field):
     """Canadian phone number field."""
Index: tests/regressiontests/forms/localflavor/ca.py
===================================================================
--- tests/regressiontests/forms/localflavor/ca.py	(revision 10020)
+++ tests/regressiontests/forms/localflavor/ca.py	(working copy)
@@ -37,9 +37,9 @@
 >>> f.clean('T2S 2H7')
 u'T2S 2H7'
 >>> f.clean('T2S2H7')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a postal code in the format XXX XXX.']
+u'T2S 2H7'
+>>> f.clean('t2s2h7')
+u'T2S 2H7'
 >>> f.clean('T2S 2H')
 Traceback (most recent call last):
 ...
@@ -171,6 +171,12 @@
 u'BC'
 >>> f.clean('nova scotia')
 u'NS'
+>>> f.clean('nf')
+u'NF'
+>>> f.clean('nl')
+u'NF'
+>>> f.clean('québec  ')
+u'QC'
 >>> f.clean('  manitoba ')
 u'MB'
 >>> f.clean('T2S 2H7')
