Adding a New Type¶
It’s easy to add converter functions for new, specialized types.
Remember that DMP already knows how to convert all of your models – you probably don’t need to add new converter functions for specific model classes.
Suppose we want to use geographic locations in the format “20.4,-162.0”. The URL might looks something like this:
http://localhost:8000/homepage/index/20.4,-162.0/
Let’s place our new class and converter function in homepage/apps.py (you can actually place these in any file that loads with Django). Decorate the function with @parameter_converter, with the type(s) as arguments.
from django.apps import AppConfig
from django_mako_plus import parameter_converter
class HomepageConfig(AppConfig):
    name = 'homepage'
class GeoLocation(object):
    def __init__(self, latitude, longitude):
        self.latitude = latitude
        self.longitude = longitude
@parameter_converter(GeoLocation)
def convert_geo_location(value, parameter):
    parts = value.split(',')
    if len(parts) < 2:
        raise ValueError('Both latitude and longitude are required')
    # the float constructor will raise ValueError if invalid
    return GeoLocation(float(parts[0]), float(parts[1]))
The function must do one of the following:
- Return the converted type.
- Raise one of these exceptions:- ValueError, which triggers the Http 404 page. This should be done for “expected” conversion errors (e.g. bad data in url).
- DMP’s RedirectException or InternalRedirectException.
- Any other exception, which triggers the Http 500 page. This should be done for unexpected errors.
 
When Django starts up, the parameter_converter decorator registers our new function as a converter.
Using the New Type¶
In homepage/views/index.py, use our custom GeoLocation class as the type hint in the index file.
from homepage.apps import GeoLocation
@view_function
def process_request(request, loc:GeoLocation):
    print(loc.latitude)
    print(loc.longitude)
    return request.dmp.render('index.html', {})
Then during each request, DMP reads the signature on process_request, looks up the GeoLocation type, and calls our function to convert the string to a GeoLocation object.