Index: django/contrib/localflavor/cs/cs_regions.py
===================================================================
--- django/contrib/localflavor/cs/cs_regions.py	(revision 0)
+++ django/contrib/localflavor/cs/cs_regions.py	(revision 0)
@@ -0,0 +1,22 @@
+#coding=utf-8
+"""
+An alphabetical list of regions for use as `choices`
+in a formfield.
+"""
+
+REGION_CHOICES = (
+    (u'PHA', u'Praha'),
+    (u'STC', u'Středočeský'),
+    (u'JHC', u'Jihočeský'),
+    (u'ULK', u'Ústecký'),
+    (u'PLK', u'Plzeňský'),
+    (u'MSK', u'Moravsko-Slezský'),
+    (u'JHM', u'Jihomoravský'),
+    (u'KVK', u'Karlovarský'),
+    (u'LBK', u'Liberecký'),
+    (u'HKK', u'Králové-Hradecký'),
+    (u'PAK', u'Pardubický'),
+    (u'VYS', u'Vysočina'),
+    (u'ZLK', u'Zlínský'),
+    (u'OLK', u'Olomoucký'),
+)
\ No newline at end of file
Index: django/contrib/localflavor/cs/__init__.py
===================================================================
Index: django/contrib/localflavor/cs/models.py
===================================================================
--- django/contrib/localflavor/cs/models.py	(revision 0)
+++ django/contrib/localflavor/cs/models.py	(revision 0)
@@ -0,0 +1,50 @@
+from django.conf import settings
+from django.db.models.fields import Field
+
+class CSRegionField(Field):
+    def get_internal_type(self):
+        return "CSRegionField"
+
+    def db_type(self):
+        if settings.DATABASE_ENGINE == 'oracle':
+            return 'CHAR(3)'
+        else:
+            return 'varchar(3)'
+
+    def formfield(self, **kwargs):
+        from django.contrib.localflavor.cs.forms import CSRegionSelect
+        defaults = {'widget': CSRegionSelect}
+        defaults.update(kwargs)
+        return super(CSRegionField, self).formfield(**defaults)
+
+class CSPhoneNumberField(Field):
+    def get_internal_type(self):
+        return "CSPhoneNumberField"
+
+    def db_type(self):
+        if settings.DATABASE_ENGINE == 'oracle':
+            return 'VARCHAR2(11)'
+        else:
+            return 'varchar(11)'
+
+    def formfield(self, **kwargs):
+        from django.contrib.localflavor.cs import forms
+        defaults = {'form_class': forms.CSPhoneNumberField}
+        defaults.update(kwargs)
+        return super(CSPhoneNumberField, self).formfield(**defaults)
+
+class CSZipCodeField(Field):
+    def get_internal_type(self):
+        return "CSZipCodeField"
+
+    def db_type(self):
+        if settings.DATABASE_ENGINE == 'oracle':
+            return 'VARCHAR2(5)'
+        else:
+            return 'varchar(5)'
+
+    def formfield(self, **kwargs):
+        from django.contrib.localflavor.cs import forms
+        defaults = {'form_class': forms.CSZipCodeField}
+        defaults.update(kwargs)
+        return super(CSZipCodeField, self).formfield(**defaults)
Index: django/contrib/localflavor/cs/forms.py
===================================================================
--- django/contrib/localflavor/cs/forms.py	(revision 0)
+++ django/contrib/localflavor/cs/forms.py	(revision 0)
@@ -0,0 +1,56 @@
+"""
+Czech-specific Form helpers
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.forms.util import smart_unicode
+from django.utils.translation import ugettext_lazy as _
+import re
+
+phone_digits_re = re.compile(r'(\d{3})-?\s?(\d{3})-?\s?(\d{3})$')
+
+class CSZipCodeField(RegexField):
+    """Czech postal code field."""
+    default_error_messages = {
+        'invalid': _(u'Enter a postal code in the format XXX XX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(CSZipCodeField, self).__init__(r'\d{3}\s?\d{2}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+class CSBirthNumberField(RegexField):
+    """Czech Birth number field."""
+    default_error_messages = {
+        'invalid': _(u'Enter a social security number in the format XXXXXX/XXXX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(CSBirthNumberField, self).__init__(r'\d{6}/\d{3,4}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+class CSPhoneNumberField(Field):
+    """Czech phone number field."""
+    default_error_messages = {
+        'invalid': _(u'Phone numbers must be in XXX-XXX-XXX format.'),
+    }
+
+    def clean(self, value):
+        """Validate a phone number.
+        """
+        super(CSPhoneNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        m = phone_digits_re.search(value)
+        if m:
+            return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3))
+        raise ValidationError(self.error_messages['invalid'])
+
+class CSRegionSelect(Select):
+    """
+    A Select widget that uses a list of Czech regions as its choices.
+    """
+    def __init__(self, attrs=None):
+        from cs_regions import REGION_CHOICES # relative import
+        super(CSRegionSelect, self).__init__(attrs, choices=REGION_CHOICES)
