Package: django-macaddress
MAC Address model and form fields for DjangoWe use netaddr to parse and validate the MAC address.  The tests aren’t
complete yet.Patches welcome:http://github.com/django-macaddress/django-macaddressRelease Notes:For release info:https://github.com/django-macaddress/django-macaddress/releasesGetting Startedsettings.MACADDRESS_DEFAULT_DIALECTTo specify a default dialect for presentation (and storage, see below), specify:settings.MACADDRESS_DEFAULT_DIALECT = 'module.dialect_class'where the specified value is a string composed of a parent python module name
and the child dialect class name. For example:settings.MACADDRESS_DEFAULT_DIALECT = 'netaddr.mac_eui48'PS: old default of macaddress.mac_linux (uppercase and divided by ‘:’ ) will be used by default.If the custom dialect is defined in a package module, you will need to define the
class in or import into the package’s__init__.py.default_dialectandformat_macTo get the default dialect for your project, import and call thedefault_dialectfunction:>>> from macaddress import default_dialect

>>> dialect = default_dialect()This function may, optionally, be called with annetaddr.EUIclass instance as its argument. If no
default is defined insettings, it will return the dialect of the providedEUIobject.Theformat_macfunction takes anEUIinstance and a dialect class (netaddr.mac_eui48or a
subclass) as its arguments. The dialect class may be specified as a string in the same manner assettings.MACADDRESS_DEFAULT_DIALECT:>>> from netaddr import EUI, mac_bare
>>> from macaddress import format_mac

>>> mac = EUI('00:12:3c:37:64:8f')
>>> format_mac(mac, mac_bare)
'00123C37648F'
>>> format_mac(mac, 'netaddr.mac_cisco')
'0012.3c37.648f'MACAddressField (ModelField)This is an example model using MACAddressField:from macaddress.fields import MACAddressField

class Computer(models.Model):
    name = models.CharField(max_length=32)
    eth0 = MACAddressField(null=True, blank=True)
    ...The default behavior is to store the MAC Address in the database is a BigInteger.
If you would, rather, store the value as a string (to, for instance, facilitate
sub-string searches), you can specifyinteger=Falseand the value will be stored
as a string:class Computer(models.Model):
    name = models.CharField(max_length=32)
    eth0 = MACAddressField(blank=True, integer=False)
    ...If you want to setunique=Trueon a MACAddressField that is stored as a string, you will need
to setnull=Trueand create customclean_<foo>methods on yourforms.ModelFormclass for
each MACAddressField that returnNonewhen the value provided is an''(empty string):from .models import Computer

class ComputerForm(forms.ModelForm):
    class Meta:
        model = Computer

    def clean_eth0(self):
        return self.cleaned_data['eth0'] or NoneYou should avoid changing the value ofintegerafter runningmanagy.py syncdb,
unless you are using a schema migration solution like South or Django’s built-in migrations.To DoAdd greater support for partial string queries when storing MACs as strings in the database.Add custom validator to check for duplicate MACs when mixing string and integer storage types.Add deprecation warning and timeline for changeover to default string storage.